1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <errno.h> 4 #include <string.h> 5 #include <sys/types.h> 6 #include <netinet/in.h> 7 #include <sys/socket.h> 8 #include <sys/wait.h> 9 10 #define SERVPORT 3333 //服务端口 11 #define BACKLOG 10 //最大连接数 12 13 int main(void) 14 { 15 int sockfd; //监听的socket 16 if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1) 17 { 18 printf("socket 创建失败!"); 19 exit(1); 20 } 21 printf("创建监听socket成功!\n"); 22 23 struct sockaddr_in myAddr; //本机地址信息的结构体 24 25 /*配置本机socket连接有关信息*/ 26 myAddr.sin_family=AF_INET; 27 myAddr.sin_port=htons(SERVPORT); 28 myAddr.sin_addr.s_addr=INADDR_ANY; //任意地址 29 bzero(&(myAddr.sin_zero),8); //填充0,保持大小一致 30 31 if(bind(sockfd,(struct sockaddr*)&myAddr,sizeof(struct sockaddr))==-1) //将创建的socket和有关本机socket配置绑定 32 { 33 printf("bind 出错!"); 34 exit(1); 35 } 36 printf("socekt绑定成功!\n"); 37 38 /*下面listen,使socket处于被动监听模式,并为该socket建立一输入数据队列,将到达的服务请求保存在此队列,直到程序处理它们*/ 39 printf("服务端开始listen......\n"); 40 int lisVal=listen(sockfd,BACKLOG); 41 printf("zhi %d",lisVal); 42 if(lisVal==-1) 43 { 44 printf("listern 出错!"); 45 exit(1); 46 } 47 printf("------listen is ok----"); 48 while(1) 49 { 50 struct sockaddr_in remoteAddr; //客户端地址信息 51 int clientFd; //数据传输socket 52 int sin_size=sizeof(struct sockaddr_in); 53 printf("----------"); 54 if((clientFd=accept(sockfd,(struct sockaddr*)&remoteAddr,&sin_size))==-1) //服务器接受客户的连接请求 55 { 56 printf("accept erro!"); 57 continue; 58 } 59 60 printf("收到一个连接来自:%s\n",inet_ntoa(remoteAddr.sin_addr)); //将网络地址转换成“.”点隔的字符串格式。 61 62 if(!fork()) //创建一个子进程 63 { 64 char* msg="连接上了,来自服务端的消息。\n"; 65 if(send(clientFd,msg,sizeof(msg),0)==-1) //子进程向这个连接发送一条信息 66 { 67 printf("send 出错!"); 68 close(clientFd); 69 exit(0); 70 } 71 } 72 close(clientFd); 73 } 74 }
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <errno.h> 4 #include <string.h> 5 #include <netdb.h> 6 #include <sys/types.h> 7 #include <netinet/in.h> 8 #include <sys/socket.h> 9 10 #define SERPORT 3333 //服务端口 11 #define MAXDATASIZE 100 //每次最大数据传输量 12 char* DES="127.0.0.1";//"192.168.1.101"; //目的地地址 13 14 int main(int argc,char* *argv[]) 15 { 16 17 /* 18 if(argc<2) 19 { 20 printf("未输入服务器地址!\n"); 21 exit(1); 22 } 23 */ 24 struct hostent * host; //服务端信息结构体 25 int sockfd; //socket标识 26 27 if((host=gethostbyname(DES))==NULL) //argv[1] 28 { 29 printf("gethostbyname错误!\n"); 30 exit(1); 31 } 32 33 printf("目的地址为:%s\n",host->h_name); 34 35 if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1) 36 { 37 printf("创建socket失败!\n"); 38 exit(1); 39 } 40 printf("创建socket成功!\n"); 41 42 /*配置目的地址信息*/ 43 struct sockaddr_in servAddr; 44 servAddr.sin_family=AF_INET; 45 servAddr.sin_port=htons(SERPORT); 46 servAddr.sin_addr=*((struct in_addr *)host->h_addr); 47 bzero(&(servAddr.sin_zero),8); 48 49 if(connect(sockfd,(struct sockaddr *)&servAddr,sizeof(struct sockaddr))==-1) //发起连接 50 { 51 printf("连接出错\n"); 52 exit(1); 53 } 54 printf("连接成功!\n"); 55 56 int recvbytes=0; //收到的字节数 57 char buf[MAXDATASIZE]; //缓冲区 58 59 if((recvbytes=recv(sockfd,buf,MAXDATASIZE,0))==-1) 60 { 61 printf("接收出错!\n"); 62 exit(1); 63 } 64 65 buf[recvbytes]='\0'; 66 printf("recvbytes值:%d \n收到信息:%s\n",recvbytes,buf); 67 printf("结束\n"); 68 close(sockfd); 69 70 return 0; 71 }