
Linux ---> 简单socket
socket()函数:创建一个IPv4地址族的TCP socket。成功返回文件描述符,失败返回-1。
发布日期:2025-04-05 18:27:16
浏览次数:7
分类:精选文章
本文共 3280 字,大约阅读时间需要 10 分钟。
服务器端代码示例
这段代码实现了一个简单的TCP服务器端程序,主要使用了socket()
、bind()
、listen()
和accept()
函数完成监听和连接处理。以下是代码的详细说明:
#include#include #include #include #include #include #include #include
- 端口定义与socket创建:定义了一个服务端口3333,并尝试创建socket。如果创建失败,会打印错误信息并退出程序。
- 地址配置:使用
socklen_t
结构体myAddr
配置socket地址信息。filled mysin_zero
部分以确保结构体对齐。 - 绑定socket:将创建好的socket绑定到指定的本地地址。如果绑定失败,会打印错误信息并退出程序。
- 监听并接受连接:设置监听队列大小为
BACKLOG
(即最多10个未接受的连接请求),并进入主循环处理客户端连接。 - 客户端连接处理:使用
accept()
函数等待并接受客户端连接。如果连接成功,会打印客户端地址信息,并进入子进程处理数据传输。 - 消息传输:子进程向客户端发送消息。如果发送失败,会打印错误信息并关闭socket。
- 端口定义与socket创建:定义了一个服务端口3333,尝试创建一个TCP socket。如果创建失败,会打印错误信息并退出程序。
- 配置与连接:将socket连接到指定的服务器地址。使用
htons()
转换端口号,servAddr
结构体存储服务器地址信息。 - 数据接收与处理:接收来自服务器端的数据,存储在缓冲区
buf
中。如果接收失败,会打印错误信息。 - 关闭socket:在程序结束时,确保正确关闭已连接的socket。
#define SERVPORT 3333#define BACKLOG 10int main(void) { int sockfd; if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { printf("socket 创建失败!"); exit(1); } printf("创建监听socket成功。\n");
struct sockaddr_in myAddr;myAddr.sin_family = AF_INET;myAddr.sin_port = htons(SERVPORT);myAddr.sin_addr.s_addr = INADDR_ANY;bzero(&myAddr.sin_zero, 8);
if (bind(sockfd, (struct sockaddr *)&myAddr, sizeof(struct sockaddr)) == -1) { printf("bind 出错!"); exit(1);}printf("socket绑定成功。\n");
printf("服务端开始listen......\n");int lisVal = listen(sockfd, BACKLOG);printf("zhi %d", lisVal);if (lisVal == -1) { printf("listen 出错!"); exit(1);}printf("------listen is ok----\n");while (1) {
struct sockaddr_in remoteAddr;int clientFd;int sin_size = sizeof(struct sockaddr_in);printf("----------");if ((clientFd = accept(sockfd, (struct sockaddr *)&remoteAddr, &sin_size)) == -1) { printf("accept erro!"); continue;}
if (!fork()) { char* msg = "连接上了,来自服务端的消息。\n"; if (send(clientFd, msg, sizeof(msg), 0) == -1) { printf("send 出错!"); close(clientFd); exit(0); }}close(clientFd);
客户端连接代码示例
这段代码实现了一个TCP客户端程序,主要使用了socket()
、connect()
和recv()
函数完成连接和数据接收。以下是代码的详细说明:
#include#include #include #include #include #include #include #include
#define SERPORT 3333#define MAXDATASIZE 100char* DES = "127.0.0.1"; // 目的地址int main(int argc, char* *argv) { struct hostent *host; int sockfd; // 如果无需指定服务器地址,可以省略这一部分 if ((host = gethostbyname(DES)) == NULL) { printf("gethostbyname错误!"); exit(1); } printf("目的地址为:%s\n", host->h_name);
struct sockaddr_in servAddr;servAddr.sin_family = AF_INET;servAddr.sin_port = htons(SERPORT);servAddr.sin_addr = *((struct in_addr *)host->h_addr);bzero(&servAddr.sin_zero, 8);if (connect(sockfd, (struct sockaddr *)&servAddr, sizeof(struct sockaddr)) == -1) { printf("连接出错\n"); exit(1);}printf("连接成功。\n");
int recvbytes = 0;char buf[MAXDATASIZE];if ((recvbytes = recv(sockfd, buf, MAXDATASIZE, 0)) == -1) { printf("接收出错!"); exit(1);}buf[recvbytes] = '\0';printf("收到信息:%s\n", buf);
printf("结束\n");close(sockfd);return 0;}
总结
以上代码示例展示了TCP协议在服务器端和客户端的典型应用,实现了基本的连接监听和数据交互功能。无论是服务器端的listen()
逻辑,还是客户端的connect()
和recv()
逻辑,都体现了TCP协议在网络通信中的重要作用。
发表评论
最新留言
不错!
[***.144.177.141]2025年04月29日 01时18分42秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Linux NFS服务器的安装与配置详解
2025-04-06
Linux NFS自动挂载autofs配置
2025-04-06
linux nmap 使用
2025-04-06
linux nohup命令
2025-04-06
Linux nohup命令不再默认输出日志文件
2025-04-06
Linux OOM-killer 内存不足时kill高内存进程的策略
2025-04-06
Linux OpenSSL 生成CA证书及终端用户证书
2025-04-06