Linux socket编程 服务器 客户端
2011-06-25 15:56
531 查看
根据网上的程序修改的,感谢!
另外有个Linux网络调试工具,tcpdump,类似xp上的wireshark,使用介绍:
http://tcpdump.anheng.com.cn/news/24/586.html
服务器端:
客户机端:
可以实现,客户机一直发送,服务器一直接收数据,原理网上的程序是只发一次。
现在这个还有个问题,退出只能Ctrl C,如果客户机先退出,服务器一直接收数据,不知道什么原因?
还有,想实现一个聊天功能,那么服务器也要想客户机发送,服务器还得一直接收数据,可能要使用多线程,这个要再学习。
另外,还有一个疑问,程序中设置端口号为2000,但是服务器每次得到的端口号不知2000,而且还变化,不知道什么原因?
另外有个Linux网络调试工具,tcpdump,类似xp上的wireshark,使用介绍:
http://tcpdump.anheng.com.cn/news/24/586.html
服务器端:
/* socksrv.c*/ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> /* for struct sockaddr_in*/ #define SRC_IP "127.0.0.1" #define BACKLOG 10 #define MYPORT 2000 int main() { char *addr; int sockfd; int connfd; struct sockaddr_in my_addr, their_addr; int res; int sin_size; char *buf; sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd == -1) { perror("socket"); exit(1); } // Init server socket addr my_addr.sin_family = AF_INET; my_addr.sin_port = htons(MYPORT); my_addr.sin_addr.s_addr = inet_addr(SRC_IP); bzero(&(my_addr.sin_zero), 8); res = bind(sockfd, (struct sockaddr*)&my_addr, sizeof(struct sockaddr)); if (res == -1) { perror("bind"); exit(1); } res = listen(sockfd, BACKLOG); if (res == -1) { perror("listen"); exit(1); } sin_size = sizeof(struct sockaddr_in); buf = (char *)malloc(255); if (buf == NULL) { printf("malloc failed/n"); exit(1); } printf("server is on.../n"); if( (connfd = accept(sockfd, (void *)&their_addr, &sin_size) ) < 0 ) perror("accept()"); printf("Client IP addr: %s, port:%d/n", inet_ntoa(their_addr.sin_addr.s_addr), (their_addr.sin_port)); while(1){ if( (res = recv(connfd, buf, 255, 0)) < 0 ){ perror("recv()"); exit(1); } if(strcmp(buf, "quit") == 0) break; printf("Client:%s/n", buf); } close(connfd); close(sockfd); free(buf); return 0; }
客户机端:
/* sockclnt.c*/ #include <stdio.h> #include <string.h> #include <stdlib.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> /*for struct sockaddr_in*/ #define DEST_IP "127.0.0.1" #define DEST_PORT 2000 #define BUFSIZE 255 int main() { int res; int sockfd; struct sockaddr_in dest_addr; char msg[10]; int len, bytes_sent; sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd == -1) { perror("socket()"); exit(1); } dest_addr.sin_family = AF_INET; dest_addr.sin_port = htons(DEST_PORT); dest_addr.sin_addr.s_addr = inet_addr(DEST_IP); bzero(&(dest_addr.sin_zero), 8); res = connect(sockfd, (struct sockaddr *)&dest_addr, sizeof(struct sockaddr_in)); if (res == -1) { perror("connect()"); exit(1); } while(fgets(msg, BUFSIZE, stdin) != NULL){ if( (send(sockfd, msg, BUFSIZE, 0))<0) perror("send()"); printf("Input: %s", msg); } close(sockfd); }
可以实现,客户机一直发送,服务器一直接收数据,原理网上的程序是只发一次。
现在这个还有个问题,退出只能Ctrl C,如果客户机先退出,服务器一直接收数据,不知道什么原因?
还有,想实现一个聊天功能,那么服务器也要想客户机发送,服务器还得一直接收数据,可能要使用多线程,这个要再学习。
另外,还有一个疑问,程序中设置端口号为2000,但是服务器每次得到的端口号不知2000,而且还变化,不知道什么原因?
相关文章推荐
- linux socket 编程一:简单的服务器和客户端通信
- TCP/TP编程 - 一个简单的Linux下C写的socket服务器客户端程序
- 网络编程(5)—— 基于Linux系统的UDP协议socket服务器和客户端
- Linux socket编程(二) 服务器与客户端的通信
- Linux socket编程学习初步(3)--客户端向服务器请求文件
- Linux socket编程-最简单的服务器和客户端程序
- linux下socket编程 select实现非阻塞模式多台客户端与服务器通信
- Linux socket编程-最简单的服务器和客户端程序
- Linux下网络socket编程——实现服务器(select)与多个客户端通信
- Linux socket编程 服务器 客户端
- Linux socket编程(二) 服务器与客户端的通信
- linux下socket编程实现一个服务器连接多个客户端
- linux下socket编程实现一个服务器连接多个客户端
- Linux socket编程(二) 服务器与客户端的通信
- linux-socket tcp客户端服务器编程模型及代码详解
- Linux 高性能服务器编程——socket选项
- linux 网络编程:客户端与服务器通过TCP协议相互通信 + UDP
- Linux网络编程[UDP客户端服务器的编程模型]
- 客户端服务器基于Socket的UDP和TCP编程介绍
- 使用socket的Linux上的C语言文件传输顺序服务器和客户端示例程序