socket编程——tcp通信

服务端(gcc)

1.绑定ip和端口(band)

2.监听(listen)

3.连接客户端(accept)

4.主线程收发消息

#include<stdio.h>
#include<stdlib.h>
#include<sys/socket.h>

int main()
{
    int listen_sock = socket(AF_INET, SOCK_STREAM, 0);
    if(listen_sock < 0)
    {
        printf("socket error!!!");
        return -1;
    }
    int val = 1;
    if(setsockopt(listen_sock, SO_SOCKET, SO_REUSEADDR,&val,sizeof(val)))
        printf("set reuseaddr error!!!");
    struct sockaddr_in sin;
    sin.sin_family = AF_INET;//ipv4
    sin.sin_port = htons(5100);
    sin.sin_addr.s_addr = INADDR_ANY;//本机任意网卡

    if(bind(listen_sock, (struct sockaddr*)&sin, sizeof(sin)))
    {
        return -1;
    }

    if(listen(listen_sock, 5))
    {
        return -1;
    }

    int client_sock;
    struct sockaddr_in server_addr;
    client_sock = accept(listen_sock, (struct sockaddr*)&server_addr, sizeof(server_addr));

    while(1)
    {
        if(client_sock < 0)
        continue;

        char recvdata[256];
        int ret = recv(client_sock, recvdata, sizeof(recvdata),0);
        if(ret >0)
            printf("%s",recvdata);

        char send_to_client[128]="hello client!";
        send(client_sock, send_to_client, sizeof(send_to_client),0);
    }
    close(client_sock);
    close(listen_sock);
    return -1;
}

客户端(vs)

1.连接服务端 (connect)

#include <stdio.h>
#include <string.h>
#include <winsock2.h>    //linux下是<sys/scoket.h>
#include <malloc.h>

#if _MSC_VER
#define snprintf _snprintf
#endif

int main()  //返回void 定义错误  需要使用int main(int *argc, char *argv[]) 或者int main(void)  或者int main()
{
	struct sockaddr_in  addr = {0};
	int resue = 1;
	int sock = socket(AF_INET, SOCK_STREAM, 0);   //linux下是SOCK_DSTREAM
	if (sock < 0)
	{
		printf("socket error!!! %s", strerror(errno));
		return -1;
	}
	
	if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char *)&resue, sizeof(resue)))
	{
		printf("setsockopt error %s", strerror(errno));
	}

	struct timeval timeo = { 2, 0 };

	if (setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (char *)&timeo, sizeof(timeo)))
	{
		printf("setsockopt error %s", strerror(errno));
	}

	addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); //linux下直接addr.sin_addr = inet_addr("127.0.0.1");  ADDR
	addr.sin_family = AF_INET;
	addr.sin_port = htons(60063);   //指定要连接的服务端的ip和端口 127.0.0.1指本机
	
	if (connect(sock, (struct sockaddr *)&addr, sizeof(addr)) == SOCKET_ERROR)
	{
		closesocket(sock);
		return 0;
	}

	char buf[128] = {0};
	int num = 128;
	int ret = snprintf(buf, sizeof(buf), "client addr = %d", num);
	send(sock,buf,sizeof(buf), 0);
	closesocket(sock);
	return 0;
}

1. SO_RCVTIMEO和SO_SNDTIMEO ,它们分别用来设置socket接收数据超时时间和发送数据超时时间。这两个选项设置后,若超时, 返回-1,并设置errno为EAGAIN或EWOULDBLOCK.

2. SO_REUSEADDR选项可实现端口复用,即一个端口可以被多个套接字绑定。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值