c_cpp 套接字连接

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c_cpp 套接字连接相关的知识,希望对你有一定的参考价值。

/*
1.创建listen监听套接字;
2.填写本地网络地址信息;
3.将监听套接字与网络地址信息进行绑定bind;
4.设置为listen状态监听网络中的连接请求;
5.accept接收远端client发送的连接请求,是TCP中建立连接的三次握手过程;
6.连接建立完毕进行数据接收;
*/
#include <stdio.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <string.h>

#define _BACKLOG_ 3 //监听状态中允许等待队列中请求的最大数

void usage(const char *argv)    //传参判断错误输出
{
    printf("%s [ip] [port]\n", argv);
    exit(1);
}

int creat_listen_socket(int ip, int port)//创建监听socket
{
	int sock = socket(AF_INET, SOCK_STREAM, 0);
	if (sock < 0)
	{
		perror("socket");
		exit(2);
	}

	struct sockaddr_in server; // 创建本地 server 网络地址信息 
	server.sin_family = AF_INET;
	server.sin_port = htons(port);
	server.sin_addr.s_addr = ip;

	if (bind(sock, (struct sockaddr*)&server, sizeof(server)) < 0) //绑定
	{
		perror("bind");
		exit(3);
	}

	if (listen(sock, _BACKLOG_) < 0)
	{
		perror("listen");
		exit(4);
	}

	return sock;
}

int main(int argc, char *argv[])
{
	if (argc != 3)
	{
		usage(argv[0]);
	}

	int ip = inet_addr(argv[1]);
	int port = atoi(argv[2]);

	int listen_sock = creat_listen_socket(ip, port);

	struct sockaddr_in client; //创建client网络地址结构体,用于存放
    socklen_t client_len = sizeof(client);

	while(1)
    {
    //处理连接请求,在accept阶段就是处理TCP三次握手连接的过程
        int accept_sock = accept(listen_sock, (struct sockaddr*)&client, &client_len);
        char *client_ip = inet_ntoa(client.sin_addr);
        int client_port = ntohs(client.sin_port);
 
        if(accept_sock < 0)
        {
            perror("accept");
            continue;
        }
        printf("client ip: %s   port: %d\n", client_ip, client_port);
 
        //将客户端的信息进行输出
        char buf[1024];
        while(1)
        {
            memset(buf, '\0', sizeof(buf));
            ssize_t size = read(accept_sock, buf, sizeof(buf)-1);
            if(size < 0)
            {
                perror("read");
                break;
            }
            else if(size == 0)
            {
                printf("client %s is out...\n", client_ip);
                exit(5);
            }
            else
                printf("client# %s\n", buf);
        }
    }
 
    return 0;
}
/*
1.创建本地套接字client_socket;
2.因为是发送连接请求的一方,所以并不需要监听,也并不需要绑定本地网络地址信息,注意并不是不可以绑定,而是没有必要,因为在发送请求时系统已经默认分配了一个端口号且将IP地址和端口号一并发送了过去;
3.进行连接请求connect;
4.连接建立完毕进行数据发送;
*/
#include <stdio.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <string.h>
 
void usage(const char* argv)//同样进行参数错误判断输出
{
    printf("%s  [ip]  [port]\n", argv);
    exit(1);
}
 
int main(int argc, char *argv[])
{
    if(argc != 3)
        usage(argv[0]);
    int server_ip = inet_addr(argv[1]);
    int server_port = atoi(argv[2]);
 
    int client_sock = socket(AF_INET, SOCK_STREAM, 0); //创建客户端socket
    if(client_sock < 0)
    {   
        perror("socket");
        exit(2);
    }   
    //只是这里需要填写要接收连接请求一方的网络地址信息,也就是远端server的地址信息
    struct sockaddr_in server;
    server.sin_family = AF_INET;
    server.sin_port = htons(server_port);
    server.sin_addr.s_addr = server_ip;
 
    //进行连接,发送连接请求
    if(connect(client_sock, (struct sockaddr*)&server, sizeof(server)) < 0)
    {   
        perror("connect");
        exit(3);
    }   
    char buf[1024];
    while(1)
    {
        memset(buf, '\0', sizeof(buf));
        // gets(buf);
        scanf("%s", buf);
        ssize_t size = write(client_sock, buf, sizeof(buf));
        if(size < 0)
        {
            perror("write");
            continue;
        }
    }
 
    return 0;
}

以上是关于c_cpp 套接字连接的主要内容,如果未能解决你的问题,请参考以下文章

c_cpp 发送文件 - c套接字

c_cpp 发送文件 - c套接字

c_cpp 发送文件 - c套接字

c_cpp C中的套接字服务器示例

c_cpp Linux的下IPC通信之本地套接字

c_cpp Linux的下TCP的套接字编程示例