Linux网络编程socket服务器端模拟实现
TCP通信流程分析:
server 服务器端主要流程
socket(),创建socket套接字
bind(),绑定ip和端口
listen(),设置监听上限,不是用来监听的
accept(),阻塞客户端监听连接
用转换大小写字符串为例子
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <ctype.h>
#define SERV_PORT 9527
void sys_err(char* str)
{
perror(str);
exit(1);
}
int main(int argc,char* argv[])
{
int lfd = 0,cfd = 0;
int ret_bind;
int ret_listen;
int ret_accept;
int ret_read;
char buf[BUFSIZ];
socklen_t clit_addr_len;
struct sockaddr_in serv_addr,clit_addr;
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(SERV_PORT);
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
lfd = socket(AF_INET,SOCK_STREAM,0);
if(lfd == -1)
{
sys_err("socket error");
}
ret_bind = bind(lfd,(struct sockaddr*)&serv_addr,sizeof(serv_addr));
if(ret_bind == -1)
{
sys_err("bind error");
}
ret_listen = listen(lfd,128); //The default maximum value is 128
clit_addr_len = sizeof(clit_addr);
ret_accept = accept(lfd,(struct sockaddr*)&clit_addr,&clit_addr_len);
if(ret_accept == -1)
{
sys_err("accept error");
}
while(1)
{
ret_read = read(ret_accept,buf,sizeof(buf));
write(STDOUT_FILENO,buf,ret_read);
for(int i = 0;i < ret_read;i++)
{
buf[i] = toupper(buf[i]);
}
write(ret_accept,buf,ret_read);
}
close(lfd);
close(ret_accept);
return 0;
}
当程序运行时将在端口堵塞,如图下
此时打开另一个端口,用nc命令连接服务器,输入hello,会返回HELLO,如图