Windows网络编程和linux网络编程我都玩, 之前的网络编程博文主要是基于Windows的, 后来一些朋友说博文中很少linux网络编程, 好吧, 姑且写一篇来玩一下。 要说明的是, linux才是网络编程的始祖, Windows不过是借鉴和改造而已。 对程序员来讲, 虽然两种环境下的网络编程有很多细微差别, 但还是有很多相通之处。
说明: 部分网友事后反馈, 本博文中的程序编译不过, 应该是在不同的linux环境下依赖的头文件不完全一致, 所以, 这里我来给个比较全面的linux网络编程头文件列表:
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <errno.h>
#include <malloc.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/ioctl.h>
#include <stdarg.h>
#include <fcntl.h>
不必纠结, 开始。 服务端程序为:
#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(不同linux机器,可能不一样哈), 启动它。
再来看客户端程序:
#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(不同linux机器,可能不一样哈), 启动它。客户端的结果为:
[taoge@localhost ~]$ gcc client.c
[taoge@localhost ~]$ ./a.out
hello 127.0.0.1, hello client.
几行代码实战胜过千言万语的啰嗦, OK, 就这样。 (注意: 如上代码如果保存在cpp文件中用g++编译, 会提示少头文件, 加上即可)