TCP server的实现,和多线程,多进程服务器

发布时间:2024-06-09
socket
在tcp/ip协议中,“ip地址 tcp/udp端口号”表示唯一网络通信中的一个进程,ip地址 端口号称为socket。
注意:
字节序有大端和小端,在两台使用不同字节序的主机上通信,为了让两台主机间能正确的通信,发送端总是把字节序转成大端字节序数据后在发送,接收方知道接受的一定是大端字节序,然后根据自己的字节序进行转化就不会出错。
调用函数
int socket(int domain, int type, int protocol)
第一个参数是告诉系统使用哪个底层协议族。对于tcp/ip协议族该参数应该设置为af_inet/pf_inet用于ipv4,两个值相同可以混用。 第二个参数 sock_stream表示传输层使用tcp,sock_dgram表式udp。 第三个参数通常都设为0,使用默认协议。
int bind(int sockfd, struct sockaddr* my_addr, socklen_t len)
struct sockaddr_in
{
sa_family_t sin_family; //地址族; af_inet
u_int16_t sin_port; //端口号
struct in_addr sin_addr; //ipv4地址结构体
}
struct in_addr
{
u_int32_t s_addr; //ipv4地址
}
bind是将my_addr所指的socket分配到未命名的sockfd文件描述符。
int listen(int sockfd, int backlog)
socket被命名之后不能马上连接,需要listen创建一个监听队列,sockfd是指被监听的socket,backlog是指处于连接状态和socket的上限。
int accept(int sockfd, struct sockaddr*addr, socklen_t *len)
从listen监听队列中接受一个连接。sockfd是执行过linten接受监听的socket。
单进程的server
/* > file name: tcp_server.c > author: weierxiao > mail: 1091868910@qq.com > created time: sat 08 jul 2017 05:15:29 pm cst / #include<stdio.h> #include<sys/socket.h> #include<netinet/in.h> #include<errno.h> #include<sys/types.h> #include<unistd.h> #include<string.h> #define _port_ 9999 #define _backlog_ 10 int main() { int sock = socket(af_inet, sock_stream,0); if (sock < 0) { printf("socket error, errno is %d, errstring is %sn", errno, strerror(errno)); } struct sockaddr_in server_sock; struct sockaddr_in client_sock; bzero(&server_sock, sizeof(server_sock)); server_sock.sin_family = af_inet; server_sock.sin_addr.s_addr = htonl(inaddr_any); server_sock.sin_port = htons(_port_); if (bind(sock, (struct sockaddr*)&server_sock, sizeof(struct sockaddr_in))< 0) { printf("bind error, errno is %d, errstring is %sn", errno, strerror(errno)); close(sock); return 1; } if (listen(sock, _backlog_)< 0) { printf("listen error, errno is %d, errstring is %sn", errno, strerror(errno)); close(sock); return 2; } printf("bind and listen success, wait accept!n"); while (1) { socklen_t len = 0; int client_socket = accept(sock, (struct sockaddr*)&client_sock,&len); if (client_socket < 0) { printf("accept error, errno is %d, errstring is %sn", errno, strerror(errno)); close(sock); return 3; } char buf_ip[inet_addrstrlen]; memset(buf_ip, 0, sizeof(buf_ip)); inet_ntop(af_inet, &client_sock.sin_addr, buf_ip, sizeof(buf_ip)); printf("get connection :ip is %s, port is %dn ",buf_ip, ntohs(client_sock.sin_port) ); while (1) { char buf[1024]; memset(buf, 0, sizeof(buf)); read(client_socket, buf, sizeof(buf)); printf("client# : %sn", buf); printf("server# :"); memset(buf, 0, sizeof(buf)); fgets(buf, sizeof(buf), stdin); buf[strlen(buf) – 1 ]= \\\’?\\\’; write(client_socket, buf, strlen(buf) 1); printf("please wait …n"); } } close(sock); return 0; } client客户端
#include<stdio.h> #include<sys/types.h> #include<sys/socket.h> #include<netinet/in.h> #include<unistd.h> #include<string.h> #include<errno.h> #include<arpa/inet.h> #define server_port 9999 #define server_ip "192.168.2.103" int main(int argc, char *argv[]) { if (argc != 2) { printf("usage : client ipn"); return 1; } char *ip = argv[1]; char buf[1024]; memset(buf,0,sizeof(buf)); struct sockaddr_in serve
上一个:艾帛乐仪表插入式涡街流量计优点以及局限性
下一个:选用FB带来的一个额外的好处

拌面做法 葱油拌面的烹饪技巧
电磁流量计在油田企业应用常见问题分析
男猴女牛婚姻是否相配
因特尔13代cpu什么时候发布,intel6代cpu什么时候发布的
订婚戒指可以直接作为婚戒吗
金花茶种植方法
如何客观评断普洱茶的质优与劣?
手机经常发热怎么解决?手机降温小妙招
女方抚养费不给会怎样解决
云服务器平台选择买哪个好