初学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;
}