Linux下Socket网络通信TCP传输Server端的C/C++实现详解

前言

接上一篇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端的,这篇就没有那么详细了,通一则通二,本质是差不多的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值