服务端(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选项可实现端口复用,即一个端口可以被多个套接字绑定。

2636

被折叠的 条评论
为什么被折叠?



