1 #include<stdio.h>
2 #include<stdlib.h>
3 #include<unistd.h>
4 #include<errno.h>
5 #include<string.h>
6 #include<sys/socket.h>
7 #include<netinet/in.h>
8 #include<arpa/inet.h>
9 /*
10 *TCP服务端-----简单的网络聊天程序
11 *1 创建socket
12 *2 为socket绑定地址端口
13 *3 开始监听socket---告诉操作系统,开始接收连接请求,并且处理连接请求
14 *4 接收连接请求-获取新连接的socket(sip sport dip dport proto)
15 *5 收发数据----recv/send
16 *6 关闭新建socket(程序结束时关闭最开始的socket)
17 * */
18
19
20 int main(int argc,char* argv[])
21 {
22 if(argc!=3){
23 printf("Usage:./tcp_serve ip port\n");
24 return -1;
25 }
26 //1 创建socket
27 int listen_fd=-1;
28 listen_fd=socket(AF_INET,SOCK_STREAM,0);
29 if(listen_fd<0){
30 perror("socket");
31 return -1;
32 }
33 struct sockaddr_in lst_addr;
34 lst_addr.sin_family=AF_INET;
35 lst_addr.sin_port=htons(atoi(argv[2]));
36 lst_addr.sin_addr.s_addr=inet_addr(argv[1]);
37
38 socklen_t len=sizeof(struct sockaddr_in);
39 //2 为socket绑定地址端口
40 int ret=bind(listen_fd,(struct sockaddr*)&lst_addr,len);
41
42 if(ret<0){
43 perror("bind");
44 return -1;
45 }
46 //3 开始监听socket---告诉操作系统,开始接收连接请求,并且处理连接请求
47 if(listen(listen_fd,5)<0){
48 perror("listen");
49 return -1;
50 }
51
52 while(1){
53 struct sockaddr_in cli_addr;
54 len=sizeof(struct sockaddr_in);
55 int new_fd;
56 // 4 接收连接请求-获取新连接的socket(sip sport dip dport proto)
57 new_fd=accept(listen_fd,(struct sockaddr*)&cli_addr,&len);
58 if(new_fd<0){
59 perror("accept");
60 continue;
61 }
62 //5 收发数据----recv/send
63 char buff[1024];
64 while(1){
65 ret=recv(new_fd,buff,1023,0);//实际接收长度
66 if(ret==0){
67 printf("client shutdown!!\n");
68 break;
69 }else if(ret<0){
70 if(errno==EINTR||errno==EAGAIN){
71 continue;
72 }
73 break;
74 }
75 printf("client say:%s\n",buff);
76
77 char tmp[1024];
78 printf("input:");
79 fflush(stdout);
80 scanf("%s",tmp);
81 send(new_fd,tmp,strlen(tmp),0);
82 }
83 close(new_fd);
84 }
85 //6 关闭新建socket(程序结束时关闭最开始的socket)
86 close(listen_fd);
87 return 0;
88 }
1 #include<stdio.h>
2 #include<stdlib.h>
3 #include<unistd.h>
4 #include<errno.h>
5 #include<string.h>
6 #include<sys/socket.h>
7 #include<netinet/in.h>
8 #include<arpa/inet.h>
9 /*
10 *TCP客户端-----简单的网络聊天程序
11 *1 创建socket
12 *2 为socket绑定地址端口-----在客户端不推荐手动绑定端口,一个端口只能被一个服务器使用
13 *3 向服务端发起连接请求 connect()
14 *4 收发数据----recv/send
15 *5 关闭socket
16 * */
17
18 int main(int argc,char *argv[]){
19 if(argc!=3){
20 printf("Usage:./tcp_client ip port\n");
21 return -1;
22 }
23 //1 创建socket
24 int sockfd=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
25 if(sockfd<0){
26 perror("socket");
27 return -1;
28 }
29
30 struct sockaddr_in ser_addr;
31 ser_addr.sin_family=AF_INET;
32 ser_addr.sin_port=htons(atoi(argv[2]));
33 ser_addr.sin_addr.s_addr=inet_addr(argv[1]);
34
35 socklen_t len=sizeof(struct sockaddr_in);
36 //2 向服务器发起连接
37 int ret=connect(sockfd,(struct sockaddr*)&ser_addr,len);
38 if(ret<0){
39 printf("connect");
40 return -1;
41 }
42 //3 收发数据----recv/send
43 while(1){
44 char buff[1024]={0};
45 printf("input:");
46 fflush(stdout);
47 scanf("%s",buff);
48 //通过socket发送数据
49 send(sockfd,buff,strlen(buff),0);
50 //接收数据
51 char tmp[1024]={0};
52 recv(sockfd,tmp,1023,0);
53 printf("server say:%s\n",tmp);
54
55 }
56
57 //5 关闭socket
58 close(sockfd);
59 return 0;
60 }