码迷,mamicode.com
首页 > 系统相关 > 详细

Linux socket编程入门(1)-TCP服务端

时间:2015-09-18 07:02:29      阅读:265      评论:0      收藏:0      [点我收藏+]

标签:


#include<stdio.h> #include<stdlib.h> #include<string.h> #include<errno.h> #include<sys/types.h> #include<sys/socket.h> #include<netinet/in.h> #define DEFAULT_PORT 8000 #define MAXLINE 4096 int main(int argc, char **argv) { int listenfd, connfd; //socket套接字 struct sockaddr_in servaddr; //ip地址的结构体 char buff[MAXLINE]; //用来存放接受数据和发送数据的BUF int response_max_length; int result; //判断各个功能是否开启成功 listenfd = socket(AF_INET, SOCK_STREAM, 0); if(listenfd == -1){ //如果返回值是-1,则我们认为函数执行错误。下同。 printf("error:socket failed\n"); return 0; } bzero(&servaddr, sizeof(servaddr)); //对内存进行初始化(填充0).
//因为结构体除了有用的信息需要填写外,
//其他元素/内容可以用零填满。 servaddr.sin_family = AF_INET; //填写必要的信息 servaddr.sin_addr.s_addr = htonl(INADDR_ANY); servaddr.sin_port = htons(9997); //htons,htonl这些函数的意思是host to online,
//是在主机编程的时候不可或缺
//的函数,因为这里涉及到数据是大端还是小端 result = bind(listenfd,(struct sockaddr *) &servaddr, sizeof(servaddr)); if(result == -1){ printf("error:bind failed\n"); return 0; }
     result = listen(listenfd,10); if(result == -1){ printf("error:listen failed\n"); return 0; } for(;;)//死循环 { connfd = accept(listenfd, (struct sockaddr *)NULL, NULL); if(connfd == -1){ printf("error:accept failed\n"); return 0; } for(;;) { response_max_length = recv(connfd, buff, MAXLINE, 0); buff[response_max_length] = ‘\0‘; printf("%s",buff); result = send(connfd, buff, 26,0); if(result == -1) { printf("error:send failed\n"); return 0; } } close(connfd); } close(listenfd); return 0; }

  这是TCP服务端的代码。服务端功能比较简单,就是把客户端发送过来的内容打印在屏幕上,并传给客户端一模一样的内容,

服务端的流程大致如下:

  1.  socket(); 获得套接字

  2.  bind();     绑定端口以及ip

  3.  listen();    监听端口

  4.  accept();   接受client端的来访。TCP三次握手就是这里完成的。

  5.  recv();       接受client发送过来的信息

  6.  send();      向client发送信息

 

函数参数讲解:

  int socket(int domain , int type , int protocol);

    这个函数的参数是固定的 (AF_INET, SOCK_STREAM, 0)。创建socket成功以后,返回一个int类型的值,表示socket。

   

    bind(int sockfd,const struct sockaddr *myaddr,socklen_t addrlen); 

    第一个参数是socket()返回的值。 第二个参数是代表IP地址的结构体 struct sockaddr。第三个参数是sizeof(struct sockaddr).

  

    int listen(int sockfd, int backlog);

    backlog 是未经过处理的连接请求队列可以容纳的最大数目。

  int accept(int sockfd, void *addr, int *addrlen);

    第二个参数是struct sockaddr类型的结构体指针。当连接成功以后,你可以通过这个指针获取client的IP地址。第三个参数同样是sizeof(struct sockaddr)。如果不需要知道client端的IP地址,第二个第三个参数可以写NULL

  int send(int sockfd, const void *msg, int len, int flags);

  int recv(int sockfd, void *buf, int len, unsigned int flags);

    第二个参数是字符数组,用来发送或者保存通讯内容的。第三个参数是字符串长度。strlen(buf)。 第四个参数flags一般写0,初学不用深究这里。

Linux socket编程入门(1)-TCP服务端

标签:

原文地址:http://www.cnblogs.com/sunfishgao/p/4818111.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!