导航:首页 > 编程语言 > linuxtcp客户端代码

linuxtcp客户端代码

发布时间:2023-09-01 01:34:15

A. linux c socket 客户端循环十次向服务器发送数据(tcp连接),为啥只能接受第一次的求代码

只是做这些动作的话不需要多线程

找了下以前写的 改成了你说的10次发送
client.c:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>

int main(int argc,char **argv)
{
char wbuf[] = "hello server";
char rbuf[128];
int i;
int sock;
struct sockaddr_in server = {0};
struct timeval timeo;

timeo.tv_sec = 0;
timeo.tv_usec = 1000 * 1000; //
socklen_t len = sizeof(timeo);
if( argc != 2)
{
printf("usage: ./client <ipaddress>\n");
return -1;
}

sock = socket(AF_INET, SOCK_STREAM, 0);
if(sock < 0)
{
perror("Create TCP Socket");

return -1;
}

setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, &timeo, len);

server.sin_family = AF_INET;
server.sin_port = htons(30000);
inet_pton(AF_INET, argv[1], &(server.sin_addr));

int res = connect(sock, (struct sockaddr*)&server, sizeof(server));
if (res < 0)
{
if(res == EINPROGRESS)
perror("connecting stream socket time out:");
else
perror("connecting stream socket error:");
close(sock);
return -1;
}
else
{
printf("Connect Server@%s\n",argv[1]);
for(i=0;i<10;i++)
{
int wsize = send(sock,wbuf,sizeof(wbuf),0);
if(wsize<=0)
{

perror("write error:");
close(sock);
return -1;
}
printf("1111111i=%d\n",i);
while(1)
{
int rsize=recv(sock,rbuf,sizeof(rbuf),0);
if(rsize>0)
{
rbuf[rsize]='\0';
printf("recv msg from server: %s\n",rbuf);
break;
}
if(rsize<0)
{
close(sock);
perror("read error:");
return -1;
}
}

}
close(sock);
return 0;
}

}

server.c:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>

int main(int argc, char** argv)
{
int listenfd, connfd;
struct sockaddr_in servaddr = {0};
char rbuf[128];
char wbuf[] = "hello client";
int n;

if( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1 )
{
perror("Create TCP Socket");
return -1;
}

servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(30000);

if( bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1)
{
perror("bind socket error:");
return -1;
}

if( listen(listenfd, 10) == -1)
{
perror("listen socket error:");
return -1;
}

printf("======waiting for client's request======\n");
while(1)
{
if( (connfd = accept(listenfd, (struct sockaddr*)NULL, NULL)) == -1)
{
perror("accept socket error:");
continue;
}
while(1)
{
n = recv(connfd, rbuf, sizeof(rbuf), 0);
if(n>0)
{
rbuf[n] = '\0';
printf("recvmsg from client: %s\n", rbuf);
n = send(connfd, wbuf, sizeof(wbuf),0);
if(n<=0)
{
perror("sned error:");
close(connfd);
break;
}
}
else if(n < 0)
{
perror("recv error:");
close(connfd);
break;
}
}
close(connfd);
}
close(listenfd);
return 0;
}

运行的时候 client
./client 你的serverip
端口我用的30000 写死在程序里了

B. Linux下c++ 服务端tcp通讯包延迟,是否有特殊的设定需要

客户端向服务器端发送请求,服务器收到请求做相应的处理,将处理结果传回客户端。下面采用TCP协议实现服务器和客户端之间的连接。
1. 客户端
约定双方的传输协议(UDP或者TCP),根据传输协议创建socket;
服务器的IP地址和端口号;
连接服务器;
获取服务器传递回来的数据。

[cpp]
#include
#include types.h>
#include socket.h>
#include time.h>
#include
#include
#includein.h>
#includeinet.h>
#include errno.h>
#include
#include
#include
using namespace std;
const int MAXLINE=1024;
int main(int argc,char** argv)
{
int sockfd,n;
char recvline[MAXLINE+1];
struct sockaddr_in servaddr;
if(argc!=2)
{
cout<<"usage: a.out<IPaddress"<<endl;
exit(0);
}
sockfd=socket(AF_INET,SOCK_STREAM,0);
if(sockfd<0)
{
cout<<"socket error"<<endl;
exit(0);
}
memset(&servaddr,0, sizeof(servaddr));
servaddr.sin_family=AF_INET;
servaddr.sin_port=htons(8080);//将无符号短整型数值转换为网络字节序,即将数值的高位字节存放到内存中的低位字节0X1234变为0X3412
if(inet_pton(AF_INET,argv[1],&servaddr.sin_addr)<=0)//将ip地址在“点分十进制”和整数之间转换
{
cout<<"inet_ptons error"<<endl;
exit(0);
}
if(connect(sockfd,(sockaddr*)&servaddr,sizeof(servaddr))<0)
{
cout<<"connect error"<<endl;
exit(0);
}
while((n=read(sockfd,recvline,MAXLINE))>0)
{
recvline[n]=0;
if(fputs(recvline,stdout)==EOF)
{
cout<<"fputs error"<<endl;
exit(0);
}
}
if(n<0)
{
cout<<"read error"<<endl;
exit(0);
}
exit(0);
}

#include
#include types.h>
#include socket.h>
#include time.h>
#include
#include
#includein.h>
#includeinet.h>
#include errno.h>
#include
#include
#include
using namespace std;
const int MAXLINE=1024;
int main(int argc,char** argv)
{
int sockfd,n;
char recvline[MAXLINE+1];
struct sockaddr_in servaddr;
if(argc!=2)
{
cout<<"usage: a.out<IPaddress"<<endl;
exit(0);
}
sockfd=socket(AF_INET,SOCK_STREAM,0);
if(sockfd<0)
{
cout<<"socket error"<<endl;
exit(0);
}
memset(&servaddr,0, sizeof(servaddr));
servaddr.sin_family=AF_INET;
servaddr.sin_port=htons(8080);//将无符号短整型数值转换为网络字节序,即将数值的高位字节存放到内存中的低位字节0X1234变为0X3412
if(inet_pton(AF_INET,argv[1],&servaddr.sin_addr)<=0)//将ip地址在“点分十进制”和整数之间转换
{
cout<<"inet_ptons error"<<endl;
exit(0);
}
if(connect(sockfd,(sockaddr*)&servaddr,sizeof(servaddr))<0)
{
cout<<"connect error"<<endl;
exit(0);
}
while((n=read(sockfd,recvline,MAXLINE))>0)
{
recvline[n]=0;
if(fputs(recvline,stdout)==EOF)
{
cout<<"fputs error"<<endl;
exit(0);
}
}
if(n<0)
{
cout<<"read error"<<endl;
exit(0);
}
exit(0);
}

2. 服务器
约定双方的传输协议(UDP或者TCP),根据传输协议创建socket;
将地址和端口绑定到socket;
对端口进行侦听,直到侦听到有连接信息;
接收连接,然后将数据写回连接中。
将地址和端口绑定到socket

[cpp]
#include
#include types.h>
#include socket.h>
#include time.h>
#include
#include
#includein.h>
#includeinet.h>
#include errno.h>
#include
#include
#include
#include
using namespace std;

const int MAXLINE=1024;
int main(int argc,char **argv)
{
int listenfd,connfd;
struct sockaddr_in servaddr;
char buff[MAXLINE];
time_t ticks;
listenfd=socket(AF_INET,SOCK_STREAM,0);//建立socket
if(listenfd<0)
{
cout<<"socket error "<<strerror(errno)<<endl;
exit(0);
}
memset(&servaddr,0, sizeof(servaddr));
servaddr.sin_family=AF_INET;
servaddr.sin_port=htons(8080);
servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
int bindfd=bind(listenfd,(sockaddr*)&servaddr,sizeof(servaddr));//将地址和端口绑定到socket
if(bindfd<0)
{
cout<<"bind error"<<bindfd<<endl;
exit(0);
}
listen(listenfd,MAXLINE);//监听连接,一直阻塞,直到有连接出现
while(1)
{
connfd=accept(listenfd,(sockaddr*)NULL,NULL);//接收连接传递的数据
ticks=time(NULL);
snprintf(buff,sizeof(buff),"%.24s ",ctime(&ticks));
cout<<strlen(buff)<<endl;
write(connfd,buff,strlen(buff));//将传递的数据写回到socket中
close(connfd);
}
return 0;
}

#include
#include types.h>
#include socket.h>
#include time.h>
#include
#include
#includein.h>
#includeinet.h>
#include errno.h>
#include
#include
#include
#include
using namespace std;

const int MAXLINE=1024;
int main(int argc,char **argv)
{
int listenfd,connfd;
struct sockaddr_in servaddr;
char buff[MAXLINE];
time_t ticks;
listenfd=socket(AF_INET,SOCK_STREAM,0);//建立socket
if(listenfd<0)
{
cout<<"socket error "<<strerror(errno)<<endl;
exit(0);
}
memset(&servaddr,0, sizeof(servaddr));
servaddr.sin_family=AF_INET;
servaddr.sin_port=htons(8080);
servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
int bindfd=bind(listenfd,(sockaddr*)&servaddr,sizeof(servaddr));//将地址和端口绑定到socket
if(bindfd<0)
{
cout<<"bind error"<<bindfd<<endl;
exit(0);
}
listen(listenfd,MAXLINE);//监听连接,一直阻塞,直到有连接出现
while(1)
{
connfd=accept(listenfd,(sockaddr*)NULL,NULL);//接收连接传递的数据
ticks=time(NULL);
snprintf(buff,sizeof(buff),"%.24s ",ctime(&ticks));
cout<<strlen(buff)<<endl;
write(connfd,buff,strlen(buff));//将传递的数据写回到socket中
close(connfd);
}
return 0;
}

C. 如何修改linux tcp

Linux系统的TCP端口范围是可以修改的,适当的调整TCP端口范围以满足个人需求,那么具体要如何修改TCP端口范围呢?不妨通过实例来了解下吧。

在启动自定义服务的时候,希望使用8370端口,却发现端口已经被nginx或node占用了,无法启动。但是lvs又已经申请了,改端口的话比较麻烦。所以可以修改下
/proc/sys/net/ipv4/ip_local_port_range
参数,使tcp协议分配的端口从一个比较大的范围开始启用,这样,node或nginx就不会占用较小的端口了。

代码如下

echo ‘32768 61000’ 》 /proc/sys/net/ipv4/ip_local_port_range

补充:临时端口范围调整

你能使用netstat命令来显示有多少个连接进入这个状态:[若是生产环境下,最好先进行测试,然后考虑一个端口的合适范围]

代码如下

shell》netstat -n | grep TIME_WAIT

shell》cat /proc/sys/net/ipv4/ip_local_port_range

32768 61000

如果需要修改 echo “start-number
end-number”,start-number和end-number是0-65536端口号范围内的数,,0-1024最好不要用,通常是熟知端口,如果是专门的代理服务器的话,很多熟知端口没有使用,当然可以考虑!

不要忘记将echo命令加到系统启动脚本中,以使机器每一次重启后都生效

D. linux下socket 网络编程(客户端向服务器端发送文件) 求源代码 大哥大姐帮帮忙 。。谢谢

server:

#include <stdio.h>
#include <errno.h>
#include <unistd.h>
#include <signal.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <syslog.h>
#include <sys/time.h>
#include <string.h>
#include <fcntl.h>
#include <sys/wait.h>

#define MAXDATASIZE 1024
#define SERVPORT 19999
#define BACKLOG 10

int SendFileToServ(const char *path, const char *FileName, const char *ip)
{
#define PORT 20002
int sockfd;
int recvbytes;
char buf[MAXDATASIZE];
char send_str[MAXDATASIZE];
char filepath[128] = {0};
struct sockaddr_in serv_addr;
FILE *fp;
sprintf(filepath, "%s%s", path, FileName);

if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
{
perror("socket");
return 1;
}
bzero(&serv_addr,sizeof(struct sockaddr_in));
serv_addr.sin_family=AF_INET;
serv_addr.sin_port=htons(PORT);
inet_aton(ip, &serv_addr.sin_addr);
int IErrCount = 0;
again:
if(connect(sockfd,(struct sockaddr *)&serv_addr,sizeof(struct sockaddr))==-1)
{
if (5 == IErrCount)
return 1;
IErrCount++;
perror("connect");
sleep(2);
goto again;
}
//if ((fp = fopen(FileName, "rb")) == NULL)
if ((fp = fopen(filepath, "rb")) == NULL)
{
perror("fopen ");
return 1;
}
recvbytes = write(sockfd, FileName, strlen(FileName));
recvbytes = read(sockfd, buf, MAXDATASIZE);
if (!memcmp(buf, "sendmsg", 7))
{
while(fgets(send_str, MAXDATASIZE, fp))
{
recvbytes = write(sockfd, send_str, strlen(send_str));
recvbytes = read(sockfd, buf, MAXDATASIZE);
if (recvbytes <= 0)
{
fclose(fp);
close(sockfd);
return 1;
}
if (memcmp(buf, "goon", 4))
{
fclose(fp);
close(sockfd);
return 1;
}
}
recvbytes = write(sockfd, "end", 3);
}
else
{
fclose(fp);
close(sockfd);
return 1;
}
memset(buf, 0, MAXDATASIZE);
if (read(sockfd, buf, MAXDATASIZE) <= 0)
{
close(sockfd);
return 2;
}
char *Eptr = "nginx reload error";
//printf("bf[%s]\n", buf);
int ret;
ret = strncmp(buf, Eptr, strlen(Eptr));
//printf("%d\n", ret);
if (!ret)
{
close(sockfd);
return 2;
}

close(sockfd);
return 0;
}

int mysyslog(const char * msg)
{
FILE *fp;
if ((fp = fopen("/tmp/tmp.log", "a+")) == NULL)
{
return 0;
}
fprintf(fp, "[%s]\n", msg);
fclose(fp);
return 0;
}
static void quit_handler(int signal)
{
kill(0, SIGUSR2);
syslog( LOG_NOTICE, "apuserv quit...");
// do something exit thing ,such as close socket ,close mysql,free list
// .....
//i end
exit(0);
}
static int re_conf = 0;
static void reconf_handler(int signal)
{
re_conf=1;
syslog(LOG_NOTICE,"apuserv reload configure file .");
// 请在循环体中判断,如果re_conf == 1,请再次加载配置文件。
}
static int isrunning(void)
{
int fd;
int ret;
struct flock lock;
lock.l_type = F_WRLCK;
lock.l_whence = 0;
lock.l_start = 0;
lock.l_len = 0;
const char *lckfile = "/tmp/apuserv.lock";
fd = open(lckfile,O_WRONLY|O_CREAT);
if (fd < 0) {
syslog(LOG_ERR,"can not create lock file: %s\n",lckfile);
return 1;
}
if ((ret = fcntl(fd,F_SETLK,&lock)) < 0) {
ret = fcntl(fd,F_GETLK,&lock);
if (lock.l_type != F_UNLCK) {
close(fd);
return lock.l_pid;
}
else {
fcntl(fd,F_SETLK,&lock);
}
}
return 0;
}

int MyHandleBuff(const char *buf, char *str, char *FileName, char *pth)
{
sscanf(buf, "%s %s %s", pth, FileName, str);
printf("path=%s\nfilename=%s\nip=%s\n", pth, FileName, str);
return 0;
}

int main(int argc, char **argv)
{
int sockfd,client_fd;
socklen_t sin_size;
struct sockaddr_in my_addr,remote_addr;
char buff[MAXDATASIZE];
int recvbytes;
#if 1
int pid ;
char ch ;
int ret;
int debug = 0;
signal(SIGUSR1, SIG_IGN);
signal(SIGUSR2, SIG_IGN);
signal(SIGHUP, SIG_IGN);
signal(SIGTERM, quit_handler);
syslog(LOG_NOTICE,"apuserver start....");
while ((ch = getopt(argc, argv, "dhV")) != -1) {
switch (ch) {
case 'd':
debug = 1;
break;
case 'V':
printf("Version:%s\n","1.0.0");
return 0;
case 'h':
printf(" -d use daemon mode\n");
printf(" -V show version\n");
return 0;
default:
printf(" -d use daemon mode\n");
printf(" -V show version\n");
}
}
if (debug && daemon(0,0 ) ) {
return -1;
}
if (isrunning()) {
fprintf(stderr, "apuserv is already running\n");
syslog(LOG_INFO,"apuserv is already running\n");
exit(0);
}
while (1) {
pid = fork();
if (pid < 0)
return -1;
if (pid == 0)
break;
while ((ret = waitpid(pid, NULL, 0)) != pid) {
syslog(LOG_NOTICE, "waitpid want %d, but got %d", pid, ret);
if (ret < 0)
syslog(LOG_NOTICE, "waitpid errno:%d", errno);
}
kill(0, SIGUSR2);
sleep(1);
syslog(LOG_NOTICE,"restart apuserver");
}
signal(SIGHUP, reconf_handler);
signal(SIGPIPE, SIG_IGN);
signal(SIGUSR1,SIG_IGN);
signal(SIGUSR2, SIG_DFL);
signal(SIGTERM, SIG_DFL);
#endif
if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
{
perror("socket");
exit(1);
}

bzero(&my_addr,sizeof(struct sockaddr_in));
my_addr.sin_family=AF_INET;
my_addr.sin_port=htons(SERVPORT);
my_addr.sin_addr.s_addr = htonl(INADDR_ANY);
if(bind(sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr))==-1)
{
perror("bind");
exit(1);
}
if(listen(sockfd,BACKLOG)==-1)
{
perror("listen");
exit(1);
}
int nret;
while(1)
{
sin_size = sizeof(struct sockaddr_in);
if((client_fd = accept(sockfd, (struct sockaddr *)&remote_addr, &sin_size))==-1)
{
perror("falied accept");
continue;
}
memset(buff, 0, MAXDATASIZE);
recvbytes = read(client_fd, buff, MAXDATASIZE);
char str[16] = {0};
char FileName[128] = {0};
char path[128] = {0};
MyHandleBuff(buff, str, FileName, path);
if (recvbytes > 0)
{
nret = SendFileToServ(path, FileName, str);
printf("nret[%d]\n", nret);
if (1 == nret)
write(client_fd, "send file error", 15);
else if(2 == nret)
write(client_fd, "reload nginx error", 18);
else
write(client_fd, "succ", 4);
}
close(client_fd);
}
}
_________________________________________________
client:
#include <stdio.h>
#include <errno.h>
#include <unistd.h>
#include <signal.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <syslog.h>
#include <sys/time.h>
#include <string.h>
#include <fcntl.h>
#include <sys/wait.h>

#define MAXDATASIZE 1024
#define SERVPORT 20002
#define BACKLOG 10

int mysyslog(const char * msg)
{
FILE *fp;
if ((fp = fopen("/tmp/tmp.log", "a+")) == NULL)
{
return 0;
}
fprintf(fp, "[%s]\n", msg);
fclose(fp);
return 0;
}
static void quit_handler(int signal)
{
kill(0, SIGUSR2);
syslog( LOG_NOTICE, "apuserv quit...");
// do something exit thing ,such as close socket ,close mysql,free list
// .....
//i end
exit(0);
}
static int re_conf = 0;
static void reconf_handler(int signal)
{
re_conf=1;
syslog(LOG_NOTICE,"apuserv reload configure file .");
// ????·???????1nf == 1£???′μ?????

static int isrunning(void)
{
int fd;
int ret;
struct flock lock;
lock.l_type = F_WRLCK;
lock.l_whence = 0;
lock.l_start = 0;
lock.l_len = 0;
const char *lckfile = "/tmp/dstserver.lock";
fd = open(lckfile,O_WRONLY|O_CREAT);
if (fd < 0) {
syslog(LOG_ERR,"can not create lock file: %s\n",lckfile);
return 1;
}
if ((ret = fcntl(fd,F_SETLK,&lock)) < 0) {
ret = fcntl(fd,F_GETLK,&lock);
if (lock.l_type != F_UNLCK) {
close(fd);
return lock.l_pid;
}
else {
fcntl(fd,F_SETLK,&lock);
}
}
return 0;
}

int main(int argc, char **argv)
{
int sockfd,client_fd;
socklen_t sin_size;
struct sockaddr_in my_addr,remote_addr;
char buff[MAXDATASIZE];
int recvbytes;
#if 1
int pid ;
char ch ;
int ret;
int debug = 0;
signal(SIGUSR1, SIG_IGN);
signal(SIGUSR2, SIG_IGN);
signal(SIGHUP, SIG_IGN);
signal(SIGTERM, quit_handler);
syslog(LOG_NOTICE,"dstserver start....");

while ((ch = getopt(argc, argv, "dhV")) != -1) {
switch (ch) {
case 'd':
debug = 1;
break;
case 'V':
printf("Version:%s\n","1.0.0");
return 0;
case 'h':
printf(" -d use daemon mode\n");
printf(" -V show version\n");
return 0;
default:
printf(" -d use daemon mode\n");
printf(" -V show version\n");
}
}
if (debug && daemon(0,0 ) ) {
return -1;
}
if (isrunning()) {
fprintf(stderr, "dstserver is already running\n");
syslog(LOG_INFO,"dstserver is already running\n");
exit(0);
}
while (1) {
pid = fork();
if (pid < 0)
return -1;
if (pid == 0)
break;
while ((ret = waitpid(pid, NULL, 0)) != pid) {
syslog(LOG_NOTICE, "waitpid want %d, but got %d", pid, ret);
if (ret < 0)
syslog(LOG_NOTICE, "waitpid errno:%d", errno);
}
kill(0, SIGUSR2);
sleep(1);
syslog(LOG_NOTICE,"restart apuserver");
}
signal(SIGHUP, reconf_handler);
signal(SIGPIPE, SIG_IGN);
signal(SIGUSR1,SIG_IGN);
signal(SIGUSR2, SIG_DFL);
signal(SIGTERM, SIG_DFL);
#endif
if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
{
perror("socket");
exit(1);
}

bzero(&my_addr,sizeof(struct sockaddr_in));
my_addr.sin_family=AF_INET;
my_addr.sin_port=htons(SERVPORT);
my_addr.sin_addr.s_addr = htonl(INADDR_ANY);
if(bind(sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr))==-1)
{
perror("bind");
exit(1);
}
if(listen(sockfd,BACKLOG)==-1)
{
perror("listen");
exit(1);
}

char filepath[MAXDATASIZE]= {0};
FILE *fp;
while(1)
{
sin_size = sizeof(struct sockaddr_in);
if((client_fd = accept(sockfd, (struct sockaddr *)&remote_addr, &sin_size))==-1)
{
perror("falied accept");
continue;
}
memset(buff, 0, MAXDATASIZE);
recvbytes = read(client_fd, buff, MAXDATASIZE);
sprintf(filepath, "/etc/nginx/url_rule/%s", buff);
if ((fp = fopen(filepath, "wb")) == NULL)
{
perror("fopen");
close(client_fd);
continue;
}
write(client_fd, "sendmsg", 7);
while(read(client_fd, buff, MAXDATASIZE))
{
if (!memcmp(buff, "end", 3))
{
fclose(fp);
break;
}
else
{
fprintf(fp, "%s", buff);
write(client_fd, "goon", 4);
}
}
//system("nginx -s reload");
char *Sptr = "nginx reload succ";
char *Eptr = "nginx reload error";
int ret;
ret = system("nginx -s reload");
printf("ret[%d]\n", ret);
if (ret != 0)
{
write(client_fd, Eptr, strlen(Eptr));
}
else
{
write(client_fd, Sptr, strlen(Sptr));
}
close(client_fd);
}
}

以前写的:内容忘记了。不是很复杂你可以自己看!

E. LINUX网络编程TCP服务器 客户端 有乱码怎么解决

解决抄办法:
1.在客户端n=read(socketfd,buff,1023);代码之前加上memset(buff,0,sizeof(buff));,这是保证收到较短数据(使用TCP你不能保证每次接收的数据和发送的数据时等长的),打印也是正确的;
2.将客户端buff[n+1]+='\0';修改为buff[n]='\0';,这是因为n是下标,已经是最后一个位置了;
3.将服务器端buff[n+1]+='\0';修改为buff[n]='\0';,这是因为n是下标,已经是最后一个位置了,而且和第2)一样,那个加号也要去掉,应该是笔误吧;
4.最大的问题,将服务器端write(connectfd,buff,1023);,你怎么能够保证收到1023个字符呢?也应该将while中条件移出作为WHILE中的一条语句,而且加上前面所述的memset语句,而将这里的write(connectfd,buff,1023);修改为write(connectfd,buff,strlen(buff))。
祝共同进步!

F. 用C语言在Linux平台上写一个占用tcp8080端口的代码。

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/wait.h>

int main()
{
int sockfd,new_fd;
struct sockaddr_in my_addr;
struct sockaddr_in their_addr;
int sin_size;
//建立TCP套接口
if((sockfd = socket(AF_INET,SOCK_STREAM,0))==-1)
{
printf("create socket error");
perror("socket");
exit(1);
}
//初始化结构体,并绑定8080端口
my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(8080);
my_addr.sin_addr.s_addr = INADDR_ANY;
bzero(&(my_addr.sin_zero),8);
//绑定套接口
if(bind(sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr))==-1)
{
perror("bind socket error");
exit(1);
}
//创建监听套接口
if(listen(sockfd,10)==-1)
{
perror("listen");
exit(1);
}
//等待连接
while(1)
{
sin_size = sizeof(struct sockaddr_in);
printf("server is run.\n");
//如果建立连接,将产生一个全新的套接字
if((new_fd = accept(sockfd,(struct sockaddr *)&their_addr,&sin_size))==-1)
{
perror("accept");
exit(1);
}
printf("accept success.\n");
//生成一个子进程来完成和客户端的会话,父进程继续监听
if(!fork())
{
printf("create new thred success.\n");
//读取客户端发来的信息
int numbytes;
char buff[256];
memset(buff,0,256);
if((numbytes = recv(new_fd,buff,sizeof(buff),0))==-1)
{
perror("recv");
exit(1);
}
printf("%s",buff);
//将从客户端接收到的信息再发回客户端
if(send(new_fd,buff,strlen(buff),0)==-1)
perror("send");
close(new_fd);
exit(0);
}
close(new_fd);
}
close(sockfd);
}

G. linux下tcp通信怎么限制客户端的连接数量

listen的backlog参数指定的是已经三次握手完成,达到了established状态但是等待accept的队列的容量。当这个专容量超过上限的时候服务器端属便不处理客户端的三次握手了。这个队列的容量当然不是楼主所说的并发连接数。
但是lisen的再后一道程序便是accept了。如果你想要的是在tcp并发连接数量超过上限的时候服务器不再处理了三次握手那么只有两种办法:
1.关闭listen的socket
2.自己修改tcp协议栈的实现,当然这个就比较麻烦了。

用iptables防火墙来限制tcp连接,
如下,限制用户的tcp连接数为50

iptables -I INPUT-p tcp -m connlimit --connlimit-above 50 -j REJECT

H. 在linux下,客户端怎么给服务器发消息(用的TCP)

linux下man getaddrinfo,里面有example。虽然用的是UDP,但是不会差太多。

I. linux和windows有没有发送tcp协议消息的命令行程序

下面大概分几个方面进行罗列:

Linux要包含

[cpp]
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <arpa/inet.h>
等头文件,而windows下则是包含
[cpp]
#include <winsock.h>


Linux中socket为整形,Windows中为一个SOCKET。
Linux中关闭socket为close,Windows中为closesocket。
Linux中有变量socklen_t,Windows中直接为int。
因为linux中的socket与普通的fd一样,所以可以在TCP的socket中,发送与接收数据时,直接使用read和write。而windows只能使用recv和send。
设置socet选项,比如设置socket为非阻塞的。Linux下为

[cpp]
flag = fcntl (fd, F_GETFL);
fcntl (fd, F_SETFL, flag | O_NONBLOCK);
,Windows下为
[cpp]
flag = 1;
ioctlsocket (fd, FIONBIO, (unsigned long *) &flag);

当非阻塞socket的TCP连接正在进行时,Linux的错误号为EINPROGRESS,Windows的错误号为WSAEWOULDBLOCK。

file
Linux下面,文件换行是"\n",而windows下面是"\r\n"。
Linux下面,目录分隔符是"/",而windows下面是"\"。
Linux与Windows下面,均可以使用stat调用来查询文件信息。但是,Linux只支持2G大小,而Windows只支持4G大小。为了支持更大的文件查询,可以在Linux环境下加

_FILE_OFFSET_BITS=64定义,在Windows下面使用_stat64调用,入参为struct __stat64。
Linux中可根据stat的st_mode判断文件类型,有S_ISREG、S_ISDIR等宏。Windows中没有,需要自己定义相应的宏,如

[cpp]
#define S_ISREG(m) (((m) & 0170000) == (0100000))
#define S_ISDIR(m) (((m) & 0170000) == (0040000))
Linux中删除文件是unlink,Windows中为DeleteFile。

time

Linux中,time_t结构是长整形。而windows中,time_t结构是64位的整形。如果要在windows始time_t为32位无符号整形,可以加宏定义,_USE_32BIT_TIME_T。
Linux中,sleep的单位为秒。Windows中,Sleep的单位为毫秒。即,Linux下sleep (1),在Windows环境下则需要Sleep (1000)。
Windows中的timecmp宏,不支持大于等于或者小于等于。
Windows中没有struct timeval结构的加减宏可以使用,需要手动定义:

阅读全文

与linuxtcp客户端代码相关的资料

热点内容
8s16升级 浏览:340
计算机网络技术基础pdf 浏览:544
javafrom提交地址参数 浏览:721
git发布版本 浏览:728
vc修改文件名 浏览:149
linux65从域 浏览:321
用什么东西压缩文件 浏览:406
怎么删除ipad隐藏的APP 浏览:981
编程如何占用大量内存 浏览:116
多个excel表格文件如何组合 浏览:918
ubuntu内核升级命令 浏览:679
pgp文件夹 浏览:894
一键还原的文件是什么格式 浏览:581
女汉子微信名霸气十足 浏览:65
win10手机蓝屏修复 浏览:419
windows2008激活工具 浏览:259
g71的编程应注意什么 浏览:572
文件路径不符合是什么意思 浏览:543
qq如何换绑微信绑定 浏览:67
文件包下载的安装包在哪里 浏览:811

友情链接