Windows网络编程和linux网络编程我都玩, 之前的网络编程博文主要是基于Windows的, 后来一些朋友说博文中很少linux网络编程, 好吧, 姑且写一篇来玩一下。 要说明的是, linux才是网络编程的始祖, Windows不过是借鉴和改造而已。 对程序员来讲, 虽然两种环境下的网络编程有很多细微差别, 但还是有很多相通之处。
不必纠结, 开始。 服务端程序为:
#include<sys/socket.h> #include<netinet/in.h> #include <stdio.h> #include <string.h> int main() { // 创建用于监听的socket int sockSrv = socket(AF_INET, SOCK_STREAM, 0); // 本地地址信息 struct sockaddr_in addrSrv; addrSrv.sin_family = AF_INET; addrSrv.sin_addr.s_addr = INADDR_ANY; addrSrv.sin_port = htons(8888); // socket与本地地址绑定 bind(sockSrv, (const struct sockaddr *)&addrSrv, sizeof(struct sockaddr_in)); // 设置socket为监听状态 listen(sockSrv, 5); struct sockaddr_in addrClient; int len = sizeof(struct sockaddr_in); // 等待接受客户端来连接, sockConn是用来与客户端通信的socket(请注意区分用于监听的addrSrv和用于通信的sockConn这两个socket) int sockConn = accept(sockSrv, (struct sockaddr *)&addrClient, &len); // 将客户端的IP地址保存下来, 并把数据返回客户端 char szSendBuf[100] = {0}; snprintf(szSendBuf, sizeof(szSendBuf), "hello %s, hello client.", inet_ntoa(addrClient.sin_addr)); send(sockConn, szSendBuf, strlen(szSendBuf) + 1, 0); getchar(); // 卡住 close(sockConn); close(sockSrv); return 0; }编译, 无error无warning, 启动它。
再来看客户端程序:
#include<sys/socket.h> #include<netinet/in.h> #include <stdio.h> int main() { int sockClient = socket(AF_INET, SOCK_STREAM, 0); struct sockaddr_in addrSrv; addrSrv.sin_addr.s_addr = inet_addr("127.0.0.1"); addrSrv.sin_family = AF_INET; addrSrv.sin_port = htons(8888); connect(sockClient, ( const struct sockaddr *)&addrSrv, sizeof(struct sockaddr_in)); char szRecvBuf[100] = {0}; recv(sockClient, szRecvBuf, sizeof(szRecvBuf) - 1, 0); printf("%s\n", szRecvBuf); getchar(); close(sockClient); return 0; }编译, 无error无warning, 启动它。客户端的结果为:
[taoge@localhost ~]$ gcc client.c
[taoge@localhost ~]$ ./a.out
hello 127.0.0.1, hello client.
几行代码实战胜过千言万语的啰嗦, OK, 就这样。