本章中关于socket代码详细功能解析在后续章节中都有提及,故遇到看不明白的可以先跳过。
1、服务端流程
- 第一步:调用socket函数创建套接字
#include <sys/socket.h>
int socket(int domain,int type,int protocol);
//成功返回文件描述符,失败返回-1
- 第二步:调用bind函数分配ip地址和端口号
#include <sys/socket.h>
int bind(int sockfd,struct sockaddr *myaddr,socklen_t addrlen);
//成功返回0,失败返回-1
- 第三步:调用listen函数转换为可接受请求状态
#include <sys/socket.h>
int listen(int sockfd,int backlog);
//成功返回0,失败返回-1
- 第四步:调用accept函数受理连接请求
#include <sys/socket.h>
int accept(int sockfd,struct sockaddr *addr,socklen_t *addrlen);
//成功返回文件描述符,失败返回-1
示例代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
void error_handling(char* message);
int main(int argc,char* argv[])
{
int serv_sock;
int clnt_sock;
struct sockaddr_in serv_addr;
struct sockaddr_in clnt_addr;
socklen_t clnt_addr_size;
char message[]="hello world";
if(argc!=2)
{
printf("Usage : %s <port>\n",argv[0]);
exit(1);
}
serv_sock=socket(PF_INET,SOCK_STREAM,0);
if(serv_sock==-1)
error_handling("socket() error");
memset(&serv_addr,0,sizeof(serv_addr));
serv_addr.sin_family=AF_INET;
serv_addr.sin_addr.s_addr=htonl(INADDR_ANY);
serv_addr.sin_port=htons(atoi(argv[1]));
if(bind(serv_sock,(struct sockaddr*)& serv_addr,sizeof(serv_addr))==-1)
error_handling("bind() error");
if(listen(serv_sock,5)==-1)
error_handling(