SO_REUSEADDR, SO_RCVBUF, SO_SNDBUF 简单用法
来源:互联网 发布:ubuntu怎么移动文件 编辑:程序博客网 时间:2024/06/05 08:41
tcpserver.c
#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <string.h>#include <errno.h>#include <sys/socket.h>#include <arpa/inet.h>#include <assert.h>#define BUFFER_SIZE 1204int main(int argc, char **argv){ if (argc <= 3) { printf("Usage:%s ip port recv_size\n", argv[0]); return -1; } const char *ip = argv[1]; int port = atoi(argv[2]); struct sockaddr_in address; bzero(&address, sizeof(address)); address.sin_family = AF_INET; address.sin_port = htons(port); inet_pton(AF_INET, ip, &address.sin_addr); int sock = socket(PF_INET, SOCK_STREAM, 0); assert(sock >= 0); int reuse = 1; setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)); int recvbuf = atoi(argv[3]); int len = sizeof(recvbuf); setsockopt(sock, SOL_SOCKET, SO_RCVBUF, &recvbuf, sizeof(recvbuf)); getsockopt(sock, SOL_SOCKET, SO_RCVBUF, &recvbuf, (socklen_t *)&len); printf("get socketopt recvbuf:%d\n", recvbuf); int ret = bind(sock, (struct sockaddr*)&address, sizeof(address)); assert(ret != -1); ret = listen(sock, 5); assert(ret != -1); struct sockaddr_in client; socklen_t client_addrlength = sizeof(client); int connfd = accept(sock, (struct sockaddr*)&client, &client_addrlength); if (connfd < 0) { printf("errno is:%d\n", errno); } else { char buffer[BUFFER_SIZE]; while(1) { memset(buffer, '\0', BUFFER_SIZE); if(recv(connfd, buffer, BUFFER_SIZE-1, 0) > 0) { printf("recv:%s\n", buffer); } else { break; } } close(connfd); } close(sock); return 0;}
tcpclient.c
#include <stdio.h>#include <stdlib.h>#include <sys/socket.h>#include <arpa/inet.h>#include <assert.h>#include <unistd.h>#include <string.h>#define BUFFER_SIZE 1024int main(int argc, char **argv){ if (argc <= 3) { printf("Usage:%s ip port send_size\n", argv[0]); return -1; } const char *ip = argv[1]; int port = atoi(argv[2]); struct sockaddr_in server_address; bzero(&server_address, sizeof(server_address)); server_address.sin_family = AF_INET; server_address.sin_port = htons(port); inet_pton(AF_INET, ip, &server_address.sin_addr); int sock = socket(PF_INET, SOCK_STREAM, 0); assert(sock >= 0); int sendbuf = atoi(argv[3]); int len = sizeof(sendbuf); setsockopt(sock, SOL_SOCKET, SO_SNDBUF, &sendbuf, sizeof(sendbuf)); getsockopt(sock, SOL_SOCKET, SO_SNDBUF, &sendbuf, (socklen_t *)&len); printf("get sockopt tcp bufffer size:%d\n", sendbuf); if(connect(sock, (struct sockaddr *)&server_address, sizeof(server_address)) != -1) { char buffer[BUFFER_SIZE]; memset(buffer, 'a', BUFFER_SIZE); send(sock, buffer, BUFFER_SIZE, 0); } else { printf("connect %s failed\n", ip); } close(sock); return 0;}
编译:
gcc tcpserver.c -o tcpserver
gcc tcpclient.c -o tcpclient
运行: ./tcpserver 127.0.0.1 55555 2000
get socketopt recvbuf:4000
recv:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
recv:aaaaaaaaaaaaaaaaaaaaaaaa
运行client:./tcpclient 127.0.0.1 55555 5000
get sockopt tcp bufffer size:10000
- SO_REUSEADDR, SO_RCVBUF, SO_SNDBUF 简单用法
- socket选项: SO_REUSEADDR, SO_RCVBUF, SO_SNDBUF
- linux网络编程四:socket选项: SO_REUSEADDR, SO_RCVBUF, SO_SNDBUF
- SO_RCVBUF SO_SNDBUF
- UNIX网络编程——套接字选项(SO_RCVBUF和SO_SNDBUF)(SO_REUSEADDR)
- SO_RCVBUF和SO_SNDBUF默认值
- setsockopt 与 SO_RCVBUF,SO_SNDBUF
- SO_SNDBUF和SO_RCVBUF
- TCP选项之SO_RCVBUF和SO_SNDBUF
- 套接字选项(SO_RCVBUF和SO_SNDBUF)
- TCP选项之SO_RCVBUF和SO_SNDBUF
- TCP的SO_RCVBUF与SO_SNDBUF的作用与意义
- SO_REUSEADDR用法
- UNIX网络编程——套接字选项(SO_RCVBUF和SO_SNDBUF)
- SO_REUSEADDR的用法
- ServerSocket选项的基本解析:SO_TIMEOUT选项、SO_REUSEADDR选项、SO_RCVBUF选项
- ServerSocket选项的基本解析:SO_TIMEOUT选项、SO_REUSEADDR选项、SO_RCVBUF选项
- SO_REUSEADDR
- 学习日记5
- poj 2454 随机
- 【洛谷1801】黑匣子
- Kaggle竞赛 —— 泰坦尼克号(Titanic)
- 进程和线程有什么联系和区别?
- SO_REUSEADDR, SO_RCVBUF, SO_SNDBUF 简单用法
- IP地址,子网掩码,默认网关,DNS服务器是什么意思?
- 如何快速阅读——《认知篇》
- lamdba表达式学习
- Laminated Composite Theoretical Principle
- java后缀表达式实现表达式求值
- vijos 1283 佳佳的魔杖
- Mybatis中service层分页是如何实现的?
- JSP报错"Syntax error on token "=", @ expected"的完美解决方案