网络编程

来源:互联网 发布:office软件卸载不了 编辑:程序博客网 时间:2024/05/17 23:08

出处:http://blog.csdn.net/hyman_c/article/details/50616360

socket服务器端编程的基本步骤:


1.1 创建套接字

int socket(int domain,int type,int protocol);
domain--协议族,常用的有AF_INET(基于IPv4的Internet协议),AF_INET6(基于IPv6的Internet协议),AF_LOCAL(Unix本地通信协议)
type--传输类型,常用的有SOCK_STREAM(面向连接的可靠的带连接的传输方式,如TCP)、SOCK_DGRAM(面向消息的不可靠的无连接的传输方式,如UDP)
protocol--指定协议,在前面两个参数确定的情况下,若存在多种协议满足条件,用来指定某个协议,通常为0
返回值--socket文件操作符

1.2 绑定地址信息

int bind(int sockfd,const struct sockaddr* addr,socklen_t* addrlen);
sockfd--服务器的socket操作符
addr--储存地址信息的结构体
addrlen--储存地址信息的结构体的长度
返回值--成功返回0,失败返回-1

1.3 开启监听

int listen(int sockfd,int backlog);
sockfd--服务器端的socket操作符
backlog--可保持的最大连接数
返回值--成功返回0,失败返回-1

1.4 接收连接

该函数为阻塞函数,直到接收到客户端的链接后退出阻塞状态
int accept(int sockfd,struct sockaddr* addr,socklen_t* addrlen);
sockfd--服务器的socket操作符
addr--用来保存客户端地址信息的结构体
addrlen--客户端地址信息结构体的长度

1.5 向客户端socket写数据

ssize_t write(int fd,void* buf,size_t count);
fd--客户端的socket操作符
buf--要写入的字符序列
count--写入的序列的长度
返回值--返回实际写入的长度

1.6 关闭套接字

close(int sockfd)
sockfd--socket标识符

示例代码serv.c:

[cpp] view plain copy
 print?
  1. #include<stdio.h>  
  2. #include<stdlib.h>  
  3. #include<string.h>  
  4. #include<unistd.h>  
  5. #include<arpa/inet.h>  
  6. #include<sys/socket.h>  
  7. void error_handling(char* message);  
  8. int main(int argc,char *argv[])  
  9. {  
  10.     int serv_sock;  
  11.     int clnt_sock;  
  12.   
  13.     struct sockaddr_in serv_addr;  
  14.     struct sockaddr_in clnt_addr;  
  15.     socklen_t clnt_addr_size;  
  16.   
  17.     char message[]="hello world!";  
  18.   
  19.     if(argc!=2)  
  20.     {  
  21.         printf("Usage : %s <port>\n",argv[0]);  
  22.         exit(1);  
  23.     }  
  24.   
  25.     serv_sock=socket(PF_INET,SOCK_STREAM,0);//创建socket  
  26.     if(serv_sock==-1)  
  27.         error_handling("sock error");  
  28.   
  29.     memset(&serv_addr,0,sizeof(serv_addr));  
  30.     serv_addr.sin_family=AF_INET;  
  31.     serv_addr.sin_addr.s_addr=htonl(INADDR_ANY);  
  32.     serv_addr.sin_port=htons(atoi(argv[1]));  
  33.   
  34.     //绑定地址信息  
  35.     if(bind(serv_sock,(struct sockaddr*)&serv_addr,sizeof(serv_addr))==-1)  
  36.         error_handling("bind error");  
  37.       
  38.     if(listen(serv_sock,5)==-1)//开启监听  
  39.         error_handling("listen error");  
  40.   
  41.     clnt_addr_size=sizeof(clnt_addr);  
  42.     //接受链接请求  
  43.     clnt_sock=accept(serv_sock,(struct sockaddr*)&clnt_addr,&clnt_addr_size);  
  44.     if(clnt_sock==-1)  
  45.         error_handling("accept error");  
  46.   
  47.     write(clnt_sock,message,sizeof(message));  
  48.     close(clnt_sock);  
  49.     close(serv_sock);  
  50.     return 0;  
  51. }  
  52.   
  53. void error_handling(char* message)  
  54. {  
  55.     fputs(message,stderr);  
  56.     fputc('\n',stderr);  
  57.     exit(1);  
  58. }  
原创粉丝点击