与http服务器的爱恨

Linux网络编程的步骤

1、创建套接字

int socket(int domain, int type, int protocol)
//作用:创建一个套接字
//参数:
// domain : 指定通讯协议族,常用的有 :
// AF_INET(IPv4通讯)
// AF_INET6(IPv6通讯)
// AF_LOCAL(本地通讯)
// type : 常用的有 :
// SOCK_STREAM(有序、可靠、双向、基于连接的字节流,即TCP)
// SOCK_DGRAM(无连接、不可靠数据报,即UDP)
// protocol : 通常取0
//返回值
// 成功 : 返回新创建的套接字文件描述符
// 失败 : 返回 -1,错误代码存于 errno 中,通过引入 <errno.h> 可以引入该变量
套接字建立TCP连接,可以通过下面代码创建TCP套接字:
int tcp_fd = socket(AF_INET , SOCK_STREAM , 0);

套接字建立UDP连接,可以通过下面代码创建UDP套接字:

2、TCP连接与通讯

1) 建立TCP server的步骤

TCP服务器的设置步骤如下:

  1. 通过 socket() 系统调用创建一个套接字;
  2. 使用 bind() 系统调用将所创建的套接字绑定到指定的端口上;
  3. 通过 listen() 将进行端口绑定的套接字进行端口侦听,使客户端能够连接;
  4. 通过 accept() 接受客户端的连接,该函数将会被阻塞,直至客户端连接上来;
  5. 数据收发 read / write

// file name : server.c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h> //定义了大量系统调用需要使用的类型
#include <sys/socket.h> //定义了大量套接字所需要的结构体

#include <netinet/in.h> //与网络相关的结构体及函数
// 该函数将字符串 msg 输出到 stderr,并退出执行
void error(char* msg){
 fprintf(stderr, "%s\n", msg); exit(1);
}
int main(int argc , char* argv[]){
 int sockfd; //保存服务器套接字的文件描述符 
int newsockfd; //保存与客户端通讯套接字的文件描述符 
int portno; //保存服务器要绑定的端口号 int clilen; //保存client地址的大小,系统调用时需要使用 
int n; //存放函数read、write的返回值 char buffer[256]; //服务器将从套接字中读取的字符存入该缓存 
struct sockaddr_in serv_addr, cli_addr ; //存放服务器、客户端套接字属性 
if(argc < 2) error("Error : no port provided.\n"); 
sockfd = socket(AF_INET , SOCK_STREAM , 0); //创建TCP套接字 
if(sockfd < 0) error("Error : fail to open socket"); 
memset(&serv_addr , 0 , sizeof(serv_addr)); 
portno = atoi(argv[1]) ; //将输入的第二个参数转换为端口号 // 配置服务器参数 serv_addr.sin_family = AF_INET;
 serv_addr.sin_port = htons(portno); serv_addr.sin_addr.s_addr = INADDR_ANY; //本机地址 0 
if(bind(sockfd, (const struct sockaddr*)&serv_addr, sizeof(serv_addr) ) < 0)
{ error("Error : binding"); } listen(sockfd, 5); //进行端口侦听 clilen = sizeof(cli_addr); //阻塞等待客户端的连接 
newsockfd = accept(sockfd, (struct sockaddr*) &cli_addr, &clilen); if(newsockfd < 0){ error("Error on accept"); } 
memset(buffer, 0, 256); n = read(newsockfd, buffer, 255); if(n < 0) error("Error reading from socket"); printf("client message : %s\n" , buffer); 
n = write(newsockfd, "I got your message", 18); 
if(n < 0)
error("Error writing to socket"); 
close(newsockfd); 
close(sockfd);
 return 0;
}


猜你喜欢

转载自blog.csdn.net/jiaochiwuzui/article/details/80901148