Socket网络编程基础
本文主要为socket服务端通信流程,使用Linux网络基础api进行最基础的网络通信。
Socket服务端通信流程
地址结构体
相关代码
#include <stdio.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <unistd.h>
#include <string.h>
#include <assert.h>
int main(){
int listenfd=socket(AF_INET,SOCK_STREAM,0);
//设置监听fd地址
struct sockaddr_in address;
bzero(&address,sizeof(address));
address.sin_family=AF_INET;
address.sin_addr.s_addr=htonl(INADDR_ANY);
address.sin_port=htons(1234);
//绑定地址
int ret=bind(listenfd,(struct sockaddr*)(&address),sizeof(address));
assert(ret!=-1);
//设置监听队列
assert(listen(listenfd,SOMAXCONN)!=-1);
//设置连接fd地址
struct sockaddr_in client_addr;
bzero(&client_addr,sizeof(client_addr));
socklen_t client_len=sizeof(client_addr);
//接受新连接
int connfd=accept(listenfd,(struct sockaddr*)&client_addr,&client_len);
assert(connfd>0);
char read_buf[1024];
char write_buf[2048];
while(1){
//初始化缓冲区
memset(read_buf,'\0',sizeof(read_buf));
int bytes_read=recv(connfd,read_buf,sizeof(read_buf)-1,0);
if(bytes_read==0){
printf("client closed\n");
close(connfd);
break;
}
memset(write_buf,'\0',sizeof(write_buf));
strcpy(write_buf,"server receive data:");
strcat(write_buf,read_buf);
send(connfd,write_buf,sizeof(write_buf)-1,0);
}
//关闭连接
//shutdown(connfd,SHUT_RDWR);//此函数可根据第二个参数只关闭读或写
close(listenfd);
return 0;
}
结果:
参考:
Linux高性能服务器编程–游双