客户端
#define PORT 8890
#define BUFFER_SIZE 1024
int main(int argc, char **argv)
{
//定义IPV4的TCP连接的套接字描述符
int sock_cli = socket(AF_INET,SOCK_STREAM, 0);
//定义sockaddr_in
struct sockaddr_in servaddr;
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = inet_addr(argv[1]);
servaddr.sin_port = htons(PORT);
//连接服务器,成功返回0,错误返回-1
res = connect(sock_cli, (struct sockaddr *)&servaddr, sizeof(servaddr));
//客户端将控制台输入的信息发送给服务器端,服务器原样返回信息,阻塞
while (fgets(sendbuf, sizeof(sendbuf), stdin) != NULL)
{
ret=send(sock_cli, sendbuf, strlen(sendbuf),0); ///发送
recv(sock_cli, recvbuf, sizeof(recvbuf),0); ///接收
fputs(recvbuf, stdout);
}
close(sock_cli);
return 0;
}
服务端
#define PORT 8890
#define QUEUE_SIZE 10
#define BUFFER_SIZE 1024
//sockfd就是互相建立好连接之后的socket文件描述符,通过这个sockfd,可以完成 [服务端]<--->[客户端] 互相收发数据
void str_echo(int sockfd)
{
char buffer[BUFFER_SIZE];
pid_t pid = getpid();
while(1)
{
/*阻塞*/
int len = recv(sockfd, buffer, sizeof(buffer),0);
send(sockfd, buffer, len, 0);
}
close(sockfd);
}
int main(int argc, char **argv)
{
//定义IPV4的TCP连接的套接字描述符
int server_sockfd = socket(AF_INET,SOCK_STREAM, 0);
//定义sockaddr_in
struct sockaddr_in server_sockaddr;
server_sockaddr.sin_family = AF_INET;
server_sockaddr.sin_addr.s_addr = htonl(INADDR_ANY);
server_sockaddr.sin_port = htons(PORT);
//bind成功返回0,出错返回-1
if(bind(server_sockfd,(struct sockaddr *)&server_sockaddr,sizeof(server_sockaddr))==-1)
//listen成功返回0,出错返回-1,允许同时帧听的连接数为QUEUE_SIZE
if(listen(server_sockfd,QUEUE_SIZE) == -1)
for(;;)
{
struct sockaddr_in client_addr;
socklen_t length = sizeof(client_addr);
//进程阻塞在accept上,成功返回非负描述字,出错返回-1
int conn = accept(server_sockfd, (struct sockaddr*)&client_addr,&length);
pid_t childid;
if ((childid = fork()) < 0)
{
printf("fork failed.\n");
return -1;
}
else if ( childid == 0){ //子进程
close(server_sockfd);//在子进程中关闭监听
str_echo(conn);//处理监听的连接
exit(0);
}
else { //父进程
}
}
close(server_sockfd);
return 0;
}
linux网络socket编程cs模式
最新推荐文章于 2021-07-28 17:33:58 发布