

客户端程序实例:
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
-
- void* read_ser(void *pad)
- {
- pthread_detach(pthread_self()); //线程分离
- int soke_c=*(int*)pad;
- while (1)
- {
- char buf[1024] = {0};
- int ret = read(soke_c,buf,1024);
- if(ret <= 0)
- {
- perror("read error");
- pthread_exit(NULL);
- }
- printf("字节长度:%d,收到的信息:%s\n",ret,buf);
- }
- }
-
- int main(int argc, char const *argv[])
- {
- if(argc != 3) //打开失败
- {
- printf("bro,you arg not Yes\n");
- return -1;
- }
-
- /*连接服务器*/
- int sock = socket(AF_INET, SOCK_STREAM, 0); //申请一个 IPV4 的流式套接字
- if(sock == -1) //申请套接字失败
- {
- perror("create socket error");
- return -1;
- }
- struct sockaddr_in Saddr; //保存服务器的地址信息的结构体
- memset(&Saddr,0,sizeof(struct sockaddr_in)); //清空结构体
- Saddr.sin_family = AF_INET; //协议族,AF_INET 表示使用 IPV4 的协议族
- Saddr.sin_port = htons(atoi(argv[2])); //端口号,但是要求的是网络字节序
- Saddr.sin_addr.s_addr = inet_addr(argv[1]); //32bit 的一个 IP地址
- int r = connect(sock,(struct sockaddr*)&Saddr,sizeof(Saddr)); //连接服务器
- if(r == -1) //连接失败
- {
- perror("connect error");
- return -1;
- }
- printf("连接成功,连接的服务器 ip 是%s,端口号是%s\n",argv[1],argv[2]);
- pthread_t tid;
- pthread_create(&tid, NULL,read_ser, (void*)&sock); //创建线程去接收服务器消息
- while(1)
- {
- char buf[1024] = {0};
- memset(buf,0,sizeof(buf));
- scanf("%[^\n]",buf);
- printf("%ld\n",strlen(buf));
- int ret = write(sock,buf,strlen(buf));
- if(ret <= 0)
- {
- perror("sendto error");
- return -1;
- }
- printf("写了多少个字节:%d\n",ret);
- }
- close(sock); //关闭套接字
- return 0;
- }
服务端程序实例:
- #include
- #include
- #include
- #include
/* See NOTES */ - #include
- #include
- #include
//为了使用 IPV4 地址结构体 - #include
- #include
- #include
- #include
-
- //线程函数,处理和一个客户端的通信
- void *my_func(void *arg)
- {
- //线程分离
- pthread_detach(pthread_self());
- int *cp = (int *)arg;
- int ret;
- while(1)
- {
- ret = sendto(*cp,"nishiliangzaima?",20,0,NULL,0); //发送消息
- if(ret <= 0)
- {
- perror("sendto error");
- free(cp);
- pthread_exit(NULL);
- }
- char buf[1024] = {0};
- ret = read(*cp,buf,1024); //读取消息
- if(ret <= 0)
- {
- perror("recv error");
- free(cp);
- pthread_exit(NULL);
- }
- printf("recv size:%d,recv data:%s\n",ret,buf);
- }
- }
-
- //./main ip port
- int main(int argc,char *argv[])
- {
- if(argc != 3)
- {
- printf("please input ip + port!\n");
- return 0;
- }
- //1.创建一个套接字
- int sockfd = socket(AF_INET, SOCK_STREAM,0);
- if(-1 == sockfd)
- {
- perror("create socket failed");
- exit(-1);
- }
- //2.绑定一个通信 IP 地址(作为服务器本身的 IP)
- struct sockaddr_in saddr; //保存服务器的地址(IP+port)
- memset(&saddr,0,sizeof(struct sockaddr_in)); //清空结构体
- saddr.sin_family = AF_INET;
- inet_aton(argv[1], &saddr.sin_addr);
- saddr.sin_port = htons(atoi(argv[2]));
- int ret = bind(sockfd,(struct sockaddr *)&saddr,sizeof(saddr));
- if(ret == -1)
- {
- perror("bind error");
- exit(-1);
- }
- printf("bind success\n");
- //3.开启对一个套接字的监听
- listen(sockfd,250);
- //4.等待客户端的连接
- while(1)
- {
- struct sockaddr_in caddr; //保存客户端的地址(IP+port)
- socklen_t len = sizeof(caddr);
- int *confp = (int *)malloc(sizeof(int));
- *confp = accept(sockfd,(struct sockaddr *)&caddr,&len);
- if(*confp > 0) //客户端连接成功,返回一个连接套接字专门用来和客户端通信
- {
- //一个客户端连接成功.开一个进程/线程去处理这个连接
- printf("client IP:%s,clientPort:%d\n",inet_ntoa(caddr.sin_addr),ntohs(caddr.sin_port));
- pthread_t tid;
- pthread_create(&tid,NULL,my_func,(void *)confp); //创建线程去处理和客户端的会话
- }
- }
- //关闭套接字
- shutdown(sockfd,SHUT_RDWR);
- close(sockfd);
- return 0;
- }
A 端:客户端
- #include
- #include
- #include
/* See NOTES */ - #include
- #include
- #include
//为了使用 IPV4 地址结构体 - #include
- #include
- #include
-
- //./main ip port
- int main(int argc,char *argv[])
- {
- if(argc != 3) //判断输入是否正确
- {
- printf("please input ip + port!\n");
- return 0;
- }
- //1.创建一个 UDP 套接字
- int sockfd = socket(AF_INET,SOCK_DGRAM,0); //创建一个 IPV4 的数据报套接字
- if(-1 == sockfd)
- {
- perror("create socket failed");
- exit(-1);
- }
- //直接发送消息(定义一个接收消息的地址)
- struct sockaddr_in addr; //保存接收消息的地址(IP+port)
- memset(&addr,0,sizeof(struct sockaddr_in)); //清空结构体
- addr.sin_family = AF_INET;
- inet_aton(argv[1], &addr.sin_addr);
- addr.sin_port = htons(atoi(argv[2]));
- while(1)
- {
- char buf[1024] = {0};
- fgets(buf,1024,stdin);
- int ret = sendto(sockfd,buf,strlen(buf),0,(struct sockaddr *)&addr,sizeof(addr));//发送数据
- if(ret <= 0)
- {
- perror("sendto error");
- }
- printf("sendto size:%d\n",ret);
- //读取服务器的回复消息
- memset(buf,0,1024);
- struct sockaddr_in src_addr; //保存消息发送方的地址(IP+port)
- memset(&src_addr,0,sizeof(struct sockaddr_in)); //清空结构体
- socklen_t src_len = sizeof(src_addr); //保存可用大小
- ret = recvfrom(sockfd,buf,1024, 0,(struct sockaddr*)&src_addr,&src_len); //接收消息
- if(ret <= 0)
- {
- perror("recvfrom error");
- }
- printf("sendIP:%s,sendPort:%d\n",inet_ntoa(src_addr.sin_addr),ntohs(src_addr.sin_port));
- printf("recv size:%d,recv data:%s\n",ret,buf);
- }
- //关闭套接字
- shutdown(sockfd,SHUT_RDWR);
- close(sockfd);
- return 0;
- }
- #include
- #include
- #include
/* See NOTES */ - #include
- #include
- #include
//为了使用 IPV4 地址结构体 - #include
- #include
- #include
-
- //./main ip port
- int main(int argc,char *argv[])
- {
- if(argc != 3)
- {
- printf("please input ip + port!\n");
- return 0;
- }
- //1.创建一个 UDP 套接字
- int sockfd = socket(AF_INET, SOCK_DGRAM,0); //创建一个 IPV4 的数据报套接字
- if(-1 == sockfd)
- {
- perror("create socket failed");
- exit(-1);
- }
- //2.绑定(可不绑定)
- struct sockaddr_in addr; //本地服务器的地址(IP+port)
- memset(&addr,0,sizeof(struct sockaddr_in)); //清空结构体
- addr.sin_family = AF_INET;
- inet_aton(argv[1], &addr.sin_addr);
- //addr.sin_addr.s_addr = INADDR_ANY; //让内核自动选择一个网卡
- addr.sin_port = htons(atoi(argv[2]));
- int ret = bind(sockfd,(struct sockaddr *)&addr,sizeof(addr)); //绑定一个 IP 和端口号,可不绑定
- if(ret == -1)
- {
- perror("bind error");
- exit(-1);
- }
- printf("bind success\n");
- while(1)
- {
- char buf[1024] = {0};
- //读取别人发送的消息
- struct sockaddr_in src_addr; //保存消息发送方的地址(IP+port)
- memset(&src_addr,0,sizeof(struct sockaddr_in)); //清空结构体
- socklen_t src_len = sizeof(src_addr); //保存可用大小
- ret = recvfrom(sockfd,buf,1024, 0,(struct sockaddr*)&src_addr,&src_len); //接收消息
- if(ret <= 0)
- {
- perror("recvfrom error");
- }
- printf("sendIP:%s,sendPort:%d\n",inet_ntoa(src_addr.sin_addr),ntohs(src_addr.sin_port));
- printf("recv size:%d,recv data:%s\n",ret,buf);
- ret = sendto(sockfd,buf,strlen(buf),0,(struct sockaddr *)&src_addr,sizeof(src_addr)); //发送消息
- if(ret <= 0)
- {
- perror("sendto error");
- }
- }
- //关闭套接字
- shutdown(sockfd,SHUT_RDWR);
- close(sockfd);
- return 0;
- }