初学Socket通信,参考的是LinuxC程序设计大全的23章的23-5例子,但是发现这个例子源码里有好几处错误,因为初学,很多不懂,吃了亏,因此将修改后能正常运行的代码记录在这里 ,参考http://www.cnblogs.com/xudong-bupt/archive/2013/12/29/3483059.html:
server.c
#include<stdio.h> #include<unistd.h> #include<ctype.h> #include<sys/socket.h> #include<arpa/inet.h> #include<string.h> #include<stdlib.h> #define MAX_LEN 100 void upper2lower(char *p) { if(p == NULL){ return ; } for(;*p !='\0';p++){ if(*p >='a' && *p <='z'){ *p -= ('a' - 'A'); } } } int main (int argc ,char **argv) { struct sockaddr_in sin; struct sockaddr_in cin; int listen_fd,connect_fd; socklen_t len; char buf[MAX_LEN]; char addr_p[INET_ADDRSTRLEN]; /** 这个长度在哪里定义*/ int port= 8887; int n; int ret; bzero(&sin,sizeof(sin)); sin.sin_family = AF_INET; sin.sin_addr.s_addr =htonl(INADDR_ANY);// 接受任意的IP sin.sin_port = htons(port); listen_fd = socket(AF_INET,SOCK_STREAM,0); printf("listen_fd= %d\n",listen_fd); ret = bind(listen_fd,(struct sockaddr*)&sin,sizeof(sin)); printf("ret= %d\n",ret); ret = listen(listen_fd,10); printf("ret= %d\n",ret); printf("Waiting ...\n"); len = sizeof(cin); while(1){ connect_fd = accept(listen_fd,(struct sockaddr*)&cin,&len); printf("connect_fd= %d\n",connect_fd); n = read (connect_fd,buf,MAX_LEN); printf("read Len = %d\n",n); inet_ntop(AF_INET,&cin.sin_addr,addr_p,sizeof(addr_p));//地址格式转化,点分十进制转换成字符串 printf("client IP is %s,port is %d \n",addr_p,ntohs(cin.sin_port)); printf("connectis %s\n",buf); upper2lower(buf); write(connect_fd,buf,n); close(connect_fd); } if(close(listen_fd)==-1){ perror("fail to close "); /**注意这里打印输出的信息*/ exit(1); } return 0; }
client.c
#include<stdio.h> #include<unistd.h> #include<ctype.h> #include<sys/socket.h> #include<arpa/inet.h> #include<string.h> #include<stdlib.h> #define MAX_LEN 100 int main (int argc ,char **argv) { struct sockaddr_in sin; char buf[MAX_LEN]; int sfd; char addr_p[INET_ADDRSTRLEN]; /** 这个长度在哪里定义*/ int port= 8887; char *Send = "senddate"; if(argc > 1){ Send = argv[1]; } bzero(&sin,sizeof(sin)); sin.sin_family = AF_INET; // IPv4 inet_pton(AF_INET,"127.0.0.1",&sin.sin_addr); //地址格式转化,字符串转换成点分十进制 sin.sin_port = htons(port); //主机字节序转换网络字节序 sfd = socket(AF_INET,SOCK_STREAM,0); if((connect(sfd,(struct sockaddr *)&sin,sizeof(sin)))<0){ perror("connect"); exit(1); } printf("start send data =%s\n",Send); write(sfd,Send,strlen(Send)); /**发送字符串,包含字符串结束符*/ read(sfd,buf,MAX_LEN); printf("receive from server : %s\n",buf); close(sfd); return 0; }
