socket通讯的简单实现(C)

服务端代码:

#include <stdio.h>
#include <sys/types.h>    // socket()
#include <sys/socket.h>   // socket() bind() listen() accept() recv()
#include <arpa/inet.h>    // htons() htonl()
#include <string.h>       // strerror()
#include <errno.h>        // errno
#include <unistd.h>       // close()
#include <stdlib.h>       // exit()

#define SERVER_PORT 9001      // 检测是否被占用 netstat -an | grep 9001
#define MAX_CONNECT_NUM 10    // 最大连接数 
#define RECV_LENGTH 1024      // recv 接收的字节数

int main(){

    printf("sercer start...\n");
    int ret = -1;

    // socket()
    int server_socket = socket(AF_INET, SOCK_STREAM, 0);

    // bind()
    struct sockaddr_in  server_in;
    memset(&server_in, 0x00, sizeof(struct sockaddr_in));
    server_in.sin_family = AF_INET;
    server_in.sin_addr.s_addr = htonl(INADDR_ANY);    // 转换为网络字节序(大端)
    server_in.sin_port = htons(SERVER_PORT);          // 转换为网络字节序(大端)
    ret = bind(server_socket, (struct sockaddr *)&server_in, sizeof(server_in));
    if(-1 == ret){
        printf("bind error[%s, errno:%d]\n", strerror(errno), errno);
        exit(0);
    }

    // listen()
    ret = listen(server_socket, MAX_CONNECT_NUM);
    if(-1 == ret){
        printf("listen error[%s, errno:%d]\n", strerror(errno), errno);
        exit(0);
    }

    // accept()
    char recvbuf[RECV_LENGTH];
    memset(recvbuf, 0x00, sizeof(recvbuf));
    
    while(1){
        int new_server_socket = accept(server_socket, (struct sockaddr *)NULL, NULL);  // 阻塞模式
        if(-1 == new_server_socket){
            printf("server accept error[%s, errno:%d]\n", strerror(errno), errno);
            continue;
        }
        printf("client connnect success...\n");

        int length = recv(new_server_socket, recvbuf, RECV_LENGTH, 0);
        recvbuf[length] = '\0';
        printf("client:[%s]\n", recvbuf);
        close(new_server_socket);
    }
    
    // close()
    close(server_socket);

    return 0;
}

客户端代码:

#include <stdio.h>
#include <sys/types.h>   // socket()
#include <sys/socket.h>  // socket() connect() send() close()
#include <arpa/inet.h>   // inet_pton()
#include <string.h>      // strerror
#include <errno.h>       // errno
#include <stdlib.h>      // exit()

#define SERVER_PORT 9001  // 服务端端口号

int main(){
    printf("client start...\n");

    int ret = -1;

    // socket()
    int client_socket = socket(AF_INET, SOCK_STREAM, 0);

    // connect()
    struct sockaddr_in client_in;
    memset(&client_in, 0x00, sizeof(client_in));
    client_in.sin_family = AF_INET;
    client_in.sin_port = htons(SERVER_PORT);  // 必须是网络字节序(大端)
    ret = inet_pton(AF_INET, "127.0.0.1", &client_in.sin_addr);
    if(ret < 0){
        printf("inet_pton error[%s, errno:%d]\n", strerror(errno), errno);
        exit(0);
    }
    ret = connect(client_socket, (struct sockaddr *)&client_in, sizeof(client_in));
    if(ret < 0){
        printf("connect error[%s, errno:%d]\n", strerror(errno), errno);
        exit(0);
    }

    // send()
    char sendbuf[1024];
    memset(sendbuf, 0x00, sizeof(sendbuf));
    printf("client input:\n");
    gets(sendbuf);
    int in_length = strlen(sendbuf);
    sendbuf[in_length] = '\0';

    ret = send(client_socket, sendbuf, 1024, 0);
    if(ret < 0){
        printf("send error[%s, errno:%d]\n", strerror(errno), errno);
        exit(0);
    }

    // close()
    close(client_socket);
    return 0;
}

Makefile:

CC=cc

all:server client 
cleanlist=server client *.o

server:server.o
	${CC} $@.c -o $@ 

client:client.o
	${CC} $@.c -o $@ 

clean:
	rm -f ${cleanlist} 

猜你喜欢

转载自blog.csdn.net/qq_34595352/article/details/87969694
今日推荐