前言
接上一篇Client端的blog,这篇记录Linux下Server端的TCP传输。
代码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<unistd.h>
#define BUF_SIZE 1024
int main(int argc, char** argv){
int listenfd, connfd;
struct sockaddr_in servaddr;
int iRet;
if( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1 ){
printf("create socket error: %s(errno: %d)\n",strerror(errno),errno);
return 0;
}
//
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htons(INADDR_ANY);
servaddr.sin_port = htons(6666);
if( bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1){
printf("bind socket error: %s(errno: %d)\n",strerror(errno),errno);
return 0;
}
if( listen(listenfd, 10) == -1){
printf("listen socket error: %s(errno: %d)\n",strerror(errno),errno);
return 0;
}
printf("======waiting for client's request======\n");
while(1){
char sendbuff[BUF_SIZE];
char recvbuff[BUF_SIZE];
connfd = accept(listenfd, (struct sockaddr*)NULL, NULL);
if( connfd == -1){
printf("accept socket error: %s(errno: %d)",strerror(errno),errno);
}
printf("connected!\n");
while(1){
sprintf(sendbuff, "Hello,World! This is server.");
send(connfd, sendbuff, sizeof(sendbuff), 0);
printf("msg has been sent!\n");
iRet = recv(connfd, recvbuff, sizeof(recvbuff), 0);
if(iRet<=0){
printf("connection stopped.\n");
break;
}
printf("recv msg from client: %s\n", recvbuff);
printf("msg has been received!\n");
}
close(connfd);
}
close(listenfd);
return 0;
}
重要知识点
https://pubs.opengroup.org/onlinepubs/007908799/xns/socket.html
有了对Client端的理解,Server端理解起来也比较容易。因此相比于上一篇,本篇会较为简略。具体参数查看见上引文档。
初始化
socket
创建socket。
成功完成后, socket() 返回一个非负整数,即套接字文件描述符(file descriptor)。否则,将返回值-1并设置errno来指示错误。
#include <sys/socket.h>
int socket(int domain, int type, int protocol);
bind
绑定接口。
成功完成后, bind() 返回0。否则,返回-1并设置errno表示错误。
#include <sys/socket.h>
int bind(int socket, const struct sockaddr *address,
socklen_t address_len);
listen
监听socket。
成功完成后, listen() 返回0。否则,返回-1并将errno设置为指示错误。
#include <sys/socket.h>
int listen(int socket, int backlog);
说下这个backlog,可理解为建立连接的上限数。
accept
接受socket上的新连接。
成功完成后, accept() 返回接受套接字的非负文件描述符(fd)。否则,返回-1并将errno设置为指示错误。
#include <sys/socket.h>
int accept (int socket, struct sockaddr *address,
socklen_t *address_len);
strerror
获取错误信息。具体可以参见这篇文章。
#include <string.h>
char *strerror(int errnum);
心得
相比上篇Client端的,这篇就没有那么详细了,通一则通二,本质是差不多的。