本章中关于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(

本文详细介绍了TCP/IP网络编程中的服务端和客户端流程,涉及socket的创建、bind、listen、accept等关键步骤。同时,讨论了在Linux与Windows下套接字的文件操作差异,以及套接字地址分配的重要性。最后,提到了套接字在服务器端listen和accept函数的区别,并对比了底层文件I/O与ANSI标准I/O函数的不同。
最低0.47元/天 解锁文章

359

被折叠的 条评论
为什么被折叠?



