linux中关于流式套接字编程代码的解释,求大神把每行代码加上注释,具体一点
发布网友
发布时间:2022-05-01 15:10
我来回答
共2个回答
热心网友
时间:2023-10-21 00:09
服务器端
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdlib.h>
int main(int argc,char* argv)
{
int server_sockfd,client_sockfd;
int server_len,client_len;
struct sockaddr_in server_address;
struct sockaddr_in client_address;
//获得一个socket文件描述符,使用tcp ip 协议
server_sockfd=socket(AF_INET,SOCK_STREAM,0);
server_address.sin_family=AF_INET;
//设置服务器端接受任何主机的请求
server_address.sin_addr.s_addr=htonl(INADDR_ANY);
//使用端口9734 来接受请求
server_address.sin_port=htons(9734);
server_len=sizeof(server_address);
//绑定socket
bind(server_sockfd,(struct sockaddr *)&server_address,server_len);
//监听连接请求,连接请求队列 大小为 5
listen(server_sockfd,5);
while(1)
{
char ch;
printf("server waiting\n");
client_len=sizeof(client_address);
//接受client 端的连接请求,如果没有连接请求,该进程将阻塞
client_sockfd=accept(server_sockfd,(struct sockaddr *)&client_address,&client_len);
//读数据
read(client_sockfd,&ch,1);
ch++;
//写数据
write(client_sockfd,&ch,1);
//关闭与client端的连接
close(client_sockfd);
}
}
客户端
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
int main(int argc,char* argv)
{
int sockfd;
int len;
struct sockaddr_in address;
int result;
char ch='A';
//设置需要连接服务器的 ip port
sockfd=socket(AF_INET,SOCK_STREAM,0);
address.sin_family=AF_INET;
address.sin_addr.s_addr=inet_addr("127.0.0.1");
address.sin_port=htons(9734);
len=sizeof(address);
//连接服务器
result=connect(sockfd,(struct sockaddr *)&address,len);
if(result==-1)
{
perror("oops:client3");
exit(1);
}
//写数据
write(sockfd,&ch,1);
//读数据
read(sockfd,&ch,1);
printf("char from server=%c\n",ch);
//关闭与服务器的连接
close(sockfd);
exit(0);
}
关于你的问题:
1.简单的方法,设置socket套接字为非阻塞模式,然后轮询,并查看是否超时。
或者是使用select poll 等方法 ,设置超时时间。
或者 使用 alarm 信号,都可以。
2..每当接收到一个client 端的连接请求,就开辟一个线程为之服务。
或者使用select poll epoll等方法,推荐这个。
3.你是指的是处理信号吗?这个有专门的函数 signal 可以处理。
热心网友
时间:2023-10-21 00:09
楼上写的真不少,30-分值的送他,辛苦了。
热心网友
时间:2023-10-21 00:09
服务器端
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdlib.h>
int main(int argc,char* argv)
{
int server_sockfd,client_sockfd;
int server_len,client_len;
struct sockaddr_in server_address;
struct sockaddr_in client_address;
//获得一个socket文件描述符,使用tcp ip 协议
server_sockfd=socket(AF_INET,SOCK_STREAM,0);
server_address.sin_family=AF_INET;
//设置服务器端接受任何主机的请求
server_address.sin_addr.s_addr=htonl(INADDR_ANY);
//使用端口9734 来接受请求
server_address.sin_port=htons(9734);
server_len=sizeof(server_address);
//绑定socket
bind(server_sockfd,(struct sockaddr *)&server_address,server_len);
//监听连接请求,连接请求队列 大小为 5
listen(server_sockfd,5);
while(1)
{
char ch;
printf("server waiting\n");
client_len=sizeof(client_address);
//接受client 端的连接请求,如果没有连接请求,该进程将阻塞
client_sockfd=accept(server_sockfd,(struct sockaddr *)&client_address,&client_len);
//读数据
read(client_sockfd,&ch,1);
ch++;
//写数据
write(client_sockfd,&ch,1);
//关闭与client端的连接
close(client_sockfd);
}
}
客户端
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
int main(int argc,char* argv)
{
int sockfd;
int len;
struct sockaddr_in address;
int result;
char ch='A';
//设置需要连接服务器的 ip port
sockfd=socket(AF_INET,SOCK_STREAM,0);
address.sin_family=AF_INET;
address.sin_addr.s_addr=inet_addr("127.0.0.1");
address.sin_port=htons(9734);
len=sizeof(address);
//连接服务器
result=connect(sockfd,(struct sockaddr *)&address,len);
if(result==-1)
{
perror("oops:client3");
exit(1);
}
//写数据
write(sockfd,&ch,1);
//读数据
read(sockfd,&ch,1);
printf("char from server=%c\n",ch);
//关闭与服务器的连接
close(sockfd);
exit(0);
}
关于你的问题:
1.简单的方法,设置socket套接字为非阻塞模式,然后轮询,并查看是否超时。
或者是使用select poll 等方法 ,设置超时时间。
或者 使用 alarm 信号,都可以。
2..每当接收到一个client 端的连接请求,就开辟一个线程为之服务。
或者使用select poll epoll等方法,推荐这个。
3.你是指的是处理信号吗?这个有专门的函数 signal 可以处理。
热心网友
时间:2023-10-21 00:09
楼上写的真不少,30-分值的送他,辛苦了。