基于UDP的Windows通信
客户端:
#include <stdio.h>
#include <WinSock2.h>
#pragma comment(lib, "ws2_32.lib")
#define SERVERIP "127.0.0.1"
#define SERVER_PORT 23333
#define BUFSIZ 4096
int main()
{
printf("【客户端:目标IP 127.0.0.1,目标端口:23333】
");
//初始化Winsock DLL
int ret;
WORD sockertVersion=MAKEWORD(2, 2);
WSADATA wsaData;
ret = WSAStartup(sockertVersion, &wsaData);
if(ret!=0)
{
printf("无法打开winsock.dll!
");
exit(-1);
}
//创建socket
SOCKET tsocket = socket(AF_INET, SOCK_DGRAM, 0);
if(tsocket == INVALID_SOCKET)
{
printf("创建socket失败!");
exit(-1);
}
//绑定和发送数据
char buffer[BUFSIZ];
printf("输入数据>>");
scanf("%s",buffer);
struct sockaddr_in servaddr;
ZeroMemory(&servaddr,sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr=inet_addr(SERVERIP);
servaddr.sin_port = htons(SERVER_PORT);
int num=0;
int len = sizeof(struct sockaddr_in);
num = sendto(tsocket,buffer, strlen(buffer) , 0, (struct sockaddr*)&servaddr, len);
if(num!=strlen(buffer))
{
printf("发送数据失败!");
exit(-1);
}
//接收数据
char buf[BUFSIZ];
num=0;
struct sockaddr_in clientaddr;
ZeroMemory(&clientaddr,sizeof(clientaddr));
ZeroMemory(buf,sizeof(buf));
num = recvfrom(tsocket,buf,sizeof(buf),0,(struct sockaddr*)&clientaddr,&len);
if(num<0)
{
printf("接收数据失败");
exit(-1);
}
else
{
printf("已接受数据>>%s
",buf);
}
closesocket(tsocket);
WSACleanup();
system("pause");
return 0;
}
客户端2.0:
#include <stdio.h>
#include <WinSock2.h>
#pragma comment(lib, "ws2_32.lib")
char *SERVERIP="127.0.0.1";
int SERVER_PORT=23334;
int my_BUFSIZ=4096;
void binner()
{
printf(" _ _ _ _ _ _ _ _
");
printf(" (_)(_)(_)(_) _ (_)_ _(_) (_)_ _(_)
");
printf(" (_) (_) (_)_ _(_) (_)_ _(_)
");
printf(" (_) _ _ _ (_) (_)_(_) (_)_(_)
");
printf(" (_)(_)(_)(_) _(_)_ (_)
");
printf(" (_) (_) _ _(_) (_)_ (_)
");
printf(" (_) (_) _ _(_) (_)_ (_)
");
printf(" (_) (_) (_) (_) (_)
");
printf("
");
}
int main(int argc,char *argv[])
{
binner();
if(argc>1)
{
if(strcmp(argv[1],"-h")==0)
{
printf("
使用说明:
");
printf("-h:帮助
");
printf("-l:服务器地址,默认127.0.0.1
");
printf("-p:端口,默认23334
");
printf("-b:发送数据大小,默认4096
");
exit(-1);
}
for(int i=1;i<argc;++i)
{
if(strcmp(argv[i],"-p")==0)
{
SERVER_PORT=atoi(argv[i+1]);
}
else if(strcmp(argv[i],"-b")==0)
{
my_BUFSIZ=atoi(argv[i+1]);
}
else if(strcmp(argv[i],"-l")==0)
{
SERVERIP = argv[i+1];
}
}
}
printf("【客户端:目标IP %s,监听端口 %d,发送数据大小:%d】
",SERVERIP,SERVER_PORT,my_BUFSIZ);
//初始化Winsock DLL
int ret;
WORD sockertVersion=MAKEWORD(2, 2);
WSADATA wsaData;
ret = WSAStartup(sockertVersion, &wsaData);
if(ret!=0)
{
printf("无法打开winsock.dll!
");
exit(-1);
}
//创建socket
SOCKET tsocket = socket(AF_INET, SOCK_DGRAM, 0);
if(tsocket == INVALID_SOCKET)
{
printf("创建socket失败!");
exit(-1);
}
//绑定和发送数据
char buffer[my_BUFSIZ];
printf("输入数据>>");
gets(buffer);
struct sockaddr_in servaddr;
ZeroMemory(&servaddr,sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr=inet_addr(SERVERIP);
servaddr.sin_port = htons(SERVER_PORT);
int num=0;
int len = sizeof(struct sockaddr_in);
num = sendto(tsocket,buffer, strlen(buffer) , 0, (struct sockaddr*)&servaddr, len);
if(num!=strlen(buffer))
{
printf("发送数据失败!");
exit(-1);
}
//接收数据
char buf[my_BUFSIZ];
ZeroMemory(buf,sizeof(buf));
num=0;
struct sockaddr_in clientaddr;
ZeroMemory(&clientaddr,sizeof(clientaddr));
num = recvfrom(tsocket,buf,sizeof(buf),0,(struct sockaddr*)&clientaddr,&len);
if(num<0)
{
printf("接收数据失败");
exit(-1);
}
else
{
printf("已接受数据>>%s
",buf);
}
closesocket(tsocket);
WSACleanup();
system("pause");
return 0;
}
服务器端:
#include <stdio.h>
#include <WinSock2.h>
#pragma comment(lib, "ws2_32.lib")
#define BUFSIZ 4096
#define SERVER_PORT 23333
int main()
{
printf("【服务端:监听端口 23333】
");
//步骤1:使用WSAStartup函数初始化Winsock DLL;
WORD scoketVersion;
scoketVersion = MAKEWORD(2, 2);
WSADATA wsaData;
int ret = WSAStartup(scoketVersion, &wsaData);
if(ret != 0 )
{
printf("无法打开 winsock.dll!
");
exit(-1);
}
//步骤2:调用socket函数创建服务器端UDP套接字;
SOCKET msock;
msock = socket(AF_INET, SOCK_DGRAM, 0);
if(msock == INVALID_SOCKET)
{
printf("创建socket失败!");
exit(-1);
}
//步骤3:调用bind()函数将该UDP套接字绑定到本机的一个可用的端点地址:
struct sockaddr_in servaddr;
ZeroMemory(&servaddr,sizeof(servaddr));
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(SERVER_PORT);
if(bind(msock, (struct sockaddr*)&servaddr, sizeof(struct sockaddr_in))< 0)
{
printf("绑定服务器端口:%d失败
",SERVER_PORT);
exit(-1);
}
//步骤4:调用revfrom函数从该UDP套接字接收来自远程客户端的数据并存入缓冲区,同时获得远程客户端的套接字端点地址并保存;
char buf[BUFSIZ];
int num=0;
struct sockaddr_in clientaddr;
int len = sizeof(clientaddr);
ZeroMemory(&clientaddr,sizeof(clientaddr));
ZeroMemory(buf,sizeof(buf));
num = recvfrom(msock, buf, sizeof(buf), 0, (struct sockaddr*)&clientaddr, &len);
if(num<0)
{
printf("接收数据失败
");
exit(-1);
}
else
{
printf("已接受数据>>%s
",buf);
}
//步骤5:基于保存的远程客户端的套接字端点地址,调用sendto()函 数将缓冲区中的数据从该UDP套接字发送给该远程客户端;
ZeroMemory(buf,sizeof(buf));
printf("输入数据>>");
scanf("%s",buf);
if(sendto(msock,buf,strlen(buf),0,(struct sockaddr*)&clientaddr,len)<0)
{
printf("发送数据失败!");
exit(-1);
}
//步骤6:与客户交互完毕,调用closesocket()函数将该UDP套接字关闭,释放所占用的系统资源;
closesocket(msock);
//步骤7:最后,调用WSACleanup0函数结束Winsock Socket API。
WSACleanup();
system("pause");
return 0;
}
服务器端2.0:
#include <stdio.h>
#include <WinSock2.h>
#pragma comment(lib, "ws2_32.lib")
int my_BUFSIZ=4096;
int SERVER_PORT=23334;
void binner()
{
printf(" _ _ _ _ _ _ _ _
");
printf(" (_)(_)(_)(_) _ (_)_ _(_) (_)_ _(_)
");
printf(" (_) (_) (_)_ _(_) (_)_ _(_)
");
printf(" (_) _ _ _ (_) (_)_(_) (_)_(_)
");
printf(" (_)(_)(_)(_) _(_)_ (_)
");
printf(" (_) (_) _ _(_) (_)_ (_)
");
printf(" (_) (_) _ _(_) (_)_ (_)
");
printf(" (_) (_) (_) (_) (_)
");
printf("
");
}
int main(int argc,char *argv[])
{
binner();
if(argc>1)
{
if(strcmp(argv[1],"-h")==0)
{
printf("
使用说明:
");
printf("-h:帮助
");
printf("-p:端口,默认23334
");
printf("-b:发送数据大小,默认4096
");
exit(-1);
}
for(int i=1;i<argc;++i)
{
if(strcmp(argv[i],"-p")==0)
{
SERVER_PORT=atoi(argv[i+1]);
}
else if(strcmp(argv[i],"-b")==0)
{
my_BUFSIZ=atoi(argv[i+1]);
}
}
}
printf("【服务端:监听端口 %d,发送数据大小:%d】
",SERVER_PORT,my_BUFSIZ);
//步骤1:使用WSAStartup函数初始化Winsock DLL;
WORD scoketVersion;
scoketVersion = MAKEWORD(2, 2);
WSADATA wsaData;
int ret = WSAStartup(scoketVersion, &wsaData);
if(ret != 0 )
{
printf("无法打开 winsock.dll!
");
exit(-1);
}
//步骤2:调用socket函数创建服务器端UDP套接字;
SOCKET msock;
msock = socket(AF_INET, SOCK_DGRAM, 0);
if(msock == INVALID_SOCKET)
{
printf("创建socket失败!");
exit(-1);
}
//步骤3:调用bind()函数将该UDP套接字绑定到本机的一个可用的端点地址:
struct sockaddr_in servaddr;
ZeroMemory(&servaddr,sizeof(servaddr));
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(SERVER_PORT);
if(bind(msock, (struct sockaddr*)&servaddr, sizeof(struct sockaddr_in))< 0)
{
printf("绑定服务器端口:%d失败
",SERVER_PORT);
exit(-1);
}
//步骤4:调用revfrom函数从该UDP套接字接收来自远程客户端的数据并存入缓冲区,同时获得远程客户端的套接字端点地址并保存;
char buf[my_BUFSIZ];
int num=0;
struct sockaddr_in clientaddr;
int len = sizeof(clientaddr);
ZeroMemory(&clientaddr,sizeof(clientaddr));
ZeroMemory(buf,sizeof(buf));
num = recvfrom(msock, buf, sizeof(buf), 0, (struct sockaddr*)&clientaddr, &len);
if(num<0)
{
printf("接收数据失败
");
exit(-1);
}
else
{
printf("已接受数据>>%s
",buf);
}
//步骤5:基于保存的远程客户端的套接字端点地址,调用sendto()函 数将缓冲区中的数据从该UDP套接字发送给该远程客户端;
ZeroMemory(buf,sizeof(buf));
printf("输入数据>>");
gets(buf);
if(sendto(msock,buf,strlen(buf),0,(struct sockaddr*)&clientaddr,len)<0)
{
printf("发送数据失败!");
exit(-1);
}
//步骤6:与客户交互完毕,调用closesocket()函数将该UDP套接字关闭,释放所占用的系统资源;
closesocket(msock);
//步骤7:最后,调用WSACleanup0函数结束Winsock Socket API。
WSACleanup();
system("pause");
return 0;
}
基于TCP的Windows通信
客户端:
#include <stdio.h>
#include <WinSock2.h>
#pragma comment(lib, "ws2_32.lib")
#define SERVERIP "127.0.0.1"
#define SERVER_PORT 23334
#define BUFSIZ 4096
int main()
{
printf("【客户端:目标IP 127.0.0.1,目标端口:23334】
");
//步骤1:使用WSAStartup()函数初始化Winsock DLL;
int ret;
WORD socketVersion=MAKEWORD(2, 2);
WSADATA wsaData;
ret = WSAStartup(socketVersion, &wsaData);
if(ret!=0)
{
printf("无法打开winsock.dll!
");
exit(-1);
}
//步骤2:调用socket()函数创建客户端TCP套接字;
SOCKET tsocket = socket(AF_INET, SOCK_STREAM, 0);
if(tsocket == INVALID_SOCKET)
{
printf("创建socket失败!");
exit(-1);
}
//步骤3:找到期望与之通信的远程服务器端套接字的端点地址(即远程服务器端的IP地址和协议端口号),
//然后再调用connect()函数向远程服务器端发起TCP连接建立请求;
struct sockaddr_in servaddr;
ZeroMemory(&servaddr,sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr=inet_addr(SERVERIP);
servaddr.sin_port = htons(SERVER_PORT);
if(connect(tsocket,(struct sockaddr*)&servaddr,sizeof(struct sockaddr))<0)
{
printf("连接失败!");
exit(-1);
}
//步骤4:在与服务器端成功地建立了TCP连接之后,
//调用send()函数将缓冲区中的数据从该TCP套接字发送给该远程服务器端;
char buffer[BUFSIZ];
printf("输入数据>>");
scanf("%s",buffer);
// char *buffer="这里是客户端~";
int num=0;
num = send(tsocket,buffer, strlen(buffer),0);
if(num!=strlen(buffer))
{
printf("发送数据失败!");
exit(-1);
}
//步骤5:调用recv()函数从该TCP套接字读取服务器端发送过来的数据并存入缓冲区;
char buf[BUFSIZ];
num=0;
ZeroMemory(buf,sizeof(buf));
num = recv(tsocket,buf,sizeof(buf),0);
if(num<0)
{
printf("接收数据失败");
exit(-1);
}
else
{
printf("已接受数据>>%s
",buf);
}
//步骤6:与服务器端交互完毕,调用closesocket()函数将该 TCP套接字关闭并释放所占用的系统资源;
closesocket(tsocket);
//步骤7:最后,调用WSACleanup()函数结束Winsock Socket API。
WSACleanup();
system("pause");
return 0;
}
客户端2.0:
#include <stdio.h>
#include <WinSock2.h>
#pragma comment(lib, "ws2_32.lib")
char *SERVERIP="127.0.0.1";
int SERVER_PORT=23334;
int my_BUFSIZ=4096;
void binner()
{
printf(" _ _ _ _ _ _ _ _
");
printf(" (_)(_)(_)(_) _ (_)_ _(_) (_)_ _(_)
");
printf(" (_) (_) (_)_ _(_) (_)_ _(_)
");
printf(" (_) _ _ _ (_) (_)_(_) (_)_(_)
");
printf(" (_)(_)(_)(_) _(_)_ (_)
");
printf(" (_) (_) _ _(_) (_)_ (_)
");
printf(" (_) (_) _ _(_) (_)_ (_)
");
printf(" (_) (_) (_) (_) (_)
");
printf("
");
}
int main(int argc,char *argv[])
{
binner();
if(argc>1)
{
if(strcmp(argv[1],"-h")==0)
{
printf("
使用说明:
");
printf("-h:帮助
");
printf("-l:服务器地址,默认127.0.0.1
");
printf("-p:端口,默认23334
");
printf("-b:发送数据大小,默认4096
");
exit(-1);
}
for(int i=1;i<argc;++i)
{
if(strcmp(argv[i],"-p")==0)
{
SERVER_PORT=atoi(argv[i+1]);
}
else if(strcmp(argv[i],"-b")==0)
{
my_BUFSIZ=atoi(argv[i+1]);
}
else if(strcmp(argv[i],"-l")==0)
{
SERVERIP = argv[i+1];
}
}
}
printf("【客户端:目标IP %s,监听端口 %d,发送数据大小:%d】
",SERVERIP,SERVER_PORT,my_BUFSIZ);
//步骤1:使用WSAStartup()函数初始化Winsock DLL;
int ret;
WORD socketVersion=MAKEWORD(2, 2);
WSADATA wsaData;
ret = WSAStartup(socketVersion, &wsaData);
if(ret!=0)
{
printf("无法打开winsock.dll!
");
exit(-1);
}
//步骤2:调用socket()函数创建客户端TCP套接字;
SOCKET tsocket = socket(AF_INET, SOCK_STREAM, 0);
if(tsocket == INVALID_SOCKET)
{
printf("创建socket失败!");
exit(-1);
}
//步骤3:找到期望与之通信的远程服务器端套接字的端点地址(即远程服务器端的IP地址和协议端口号),
//然后再调用connect()函数向远程服务器端发起TCP连接建立请求;
struct sockaddr_in servaddr;
ZeroMemory(&servaddr,sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr=inet_addr(SERVERIP);
servaddr.sin_port = htons(SERVER_PORT);
if(connect(tsocket,(struct sockaddr*)&servaddr,sizeof(struct sockaddr))<0)
{
printf("连接失败!");
exit(-1);
}
//步骤4:在与服务器端成功地建立了TCP连接之后,
//调用send()函数将缓冲区中的数据从该TCP套接字发送给该远程服务器端;
char buffer[my_BUFSIZ];
printf("输入数据>>");
scanf("%s",buffer);
// char *buffer="这里是客户端~";
int num=0;
num = send(tsocket,buffer, strlen(buffer),0);
if(num!=strlen(buffer))
{
printf("发送数据失败!");
exit(-1);
}
//步骤5:调用recv()函数从该TCP套接字读取服务器端发送过来的数据并存入缓冲区;
char buf[my_BUFSIZ];
num=0;
ZeroMemory(buf,sizeof(buf));
num = recv(tsocket,buf,sizeof(buf),0);
if(num<0)
{
printf("接收数据失败");
exit(-1);
}
else
{
printf("已接受数据>>%s
",buf);
}
//步骤6:与服务器端交互完毕,调用closesocket()函数将该 TCP套接字关闭并释放所占用的系统资源;
closesocket(tsocket);
//步骤7:最后,调用WSACleanup()函数结束Winsock Socket API。
WSACleanup();
system("pause");
return 0;
}
服务器端:
#include <stdio.h>
#include <WinSock2.h>
#pragma comment(lib, "ws2_32.lib")
#define BUFSIZ 4096
#define SERVER_PORT 23334
int main()
{
//步骤1:使用WSAStartup()函数初始化Winsock DLL;
printf("【服务端:监听端口 23334】
");
WORD scoketVersion;
scoketVersion = MAKEWORD(2, 2);
WSADATA wsaData;
int ret = WSAStartup(scoketVersion, &wsaData);
if(ret != 0 )
{
printf("无法打开 winsock.dll!
");
exit(-1);
}
//步骤2:调用socket()函数创建服务器端TCP主套接字;
SOCKET msock;
msock = socket(AF_INET, SOCK_STREAM, 0);
if(msock == INVALID_SOCKET)
{
printf("创建socket失败!");
exit(-1);
}
//步骤3:调用bind()函数将TCP主套接字绑定到本机的一个可用的端点地址:
struct sockaddr_in servaddr;
ZeroMemory(&servaddr,sizeof(servaddr));
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(SERVER_PORT);
ret = bind(msock, (struct sockaddr*)&servaddr, sizeof(struct sockaddr_in));
if(ret < 0)
{
printf("绑定服务器端口:%d失败
",SERVER_PORT);
exit(-1);
}
//步骤4:调用listen()函数将该TCP主套核字设为被动模式,并设置等待队列长度:
#define QUEUE 20
if(listen(msock,QUEUE)<0)
{
printf("监听失败!");
exit(-1);
}
//步骤5:调用accpet()函数从该TCP主套接字上接收一个新的客户 TCP连接请求,
//并在与该客户之间成功建立了TCP连接之后,为该TCP连接创建一一个新的从套接字
//(由该新的从套接字来负责与客户之间进行实际的通信);
SOCKET ssock;
struct sockaddr_in clientaddr;
int len = sizeof(clientaddr);
ZeroMemory(&clientaddr,sizeof(clientaddr));
ssock=accept(msock,(struct sockaddr*)&clientaddr,&len);
if(ssock==INVALID_SOCKET)
{
printf("接收数据失败
");
exit(-1);
}
//步骤6:基于新创建的从套接字,调用recv()函数利用 该从套接字读取客户端发送过来的数据并存入缓冲区;
char buf[BUFSIZ];
ZeroMemory(buf,sizeof(buf));
if(recv(ssock, buf, sizeof(buf), 0)<0)
{
printf("接收数据失败
");
exit(-1);
}
else
{
printf("已接受数据>>%s
",buf);
}
//步骤7:基于新创建的从套接字,调用send()函数将缓冲区中的数据利用该从套接字发送给该远程客户端;
//char *buffer="这里是服务器~";
char buffer[BUFSIZ];
printf("输入数据>>");
scanf("%s",buffer);
if(send(ssock,buffer,strlen(buffer),0)!=strlen(buffer))
{
printf("发送数据失败!");
exit(-1);
}
//步骤8:与客户交互完毕,调用closesocket()函数将该从套接字关闭,释放所占用的系统资源);
closesocket(ssock);
//步骤9:最后,当与所有客户交互完毕之后,调用closesocket()函数将TCP主套接字关闭,
//释放所古用的系统资源,然后,再调用WSACleanup()函数来结束Winsock Socket API
closesocket(msock);
WSACleanup();
system("pause");
return 0;
}
服务器端2.0:
#include <stdio.h>
#include <WinSock2.h>
#pragma comment(lib, "ws2_32.lib")
int my_BUFSIZ=4096;
int SERVER_PORT=23334;
void binner()
{
printf(" _ _ _ _ _ _ _ _
");
printf(" (_)(_)(_)(_) _ (_)_ _(_) (_)_ _(_)
");
printf(" (_) (_) (_)_ _(_) (_)_ _(_)
");
printf(" (_) _ _ _ (_) (_)_(_) (_)_(_)
");
printf(" (_)(_)(_)(_) _(_)_ (_)
");
printf(" (_) (_) _ _(_) (_)_ (_)
");
printf(" (_) (_) _ _(_) (_)_ (_)
");
printf(" (_) (_) (_) (_) (_)
");
printf("
");
}
int main(int argc,char *argv[])
{
binner();
if(argc>1)
{
if(strcmp(argv[1],"-h")==0)
{
printf("
使用说明:
");
printf("-h:帮助
");
printf("-p:端口,默认23334
");
printf("-b:发送数据大小,默认4096
");
exit(-1);
}
for(int i=1;i<argc;++i)
{
if(strcmp(argv[i],"-p")==0)
{
SERVER_PORT=atoi(argv[i+1]);
}
else if(strcmp(argv[i],"-b")==0)
{
my_BUFSIZ=atoi(argv[i+1]);
}
}
}
//步骤1:使用WSAStartup()函数初始化Winsock DLL;
printf("【服务端:监听端口 %d,发送数据大小:%d】
",SERVER_PORT,my_BUFSIZ);
WORD scoketVersion;
scoketVersion = MAKEWORD(2, 2);
WSADATA wsaData;
int ret = WSAStartup(scoketVersion, &wsaData);
if(ret != 0 )
{
printf("无法打开 winsock.dll!
");
exit(-1);
}
//步骤2:调用socket()函数创建服务器端TCP主套接字;
SOCKET msock;
msock = socket(AF_INET, SOCK_STREAM, 0);
if(msock == INVALID_SOCKET)
{
printf("创建socket失败!");
exit(-1);
}
//步骤3:调用bind()函数将TCP主套接字绑定到本机的一个可用的端点地址:
struct sockaddr_in servaddr;
ZeroMemory(&servaddr,sizeof(servaddr));
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(SERVER_PORT);
ret = bind(msock, (struct sockaddr*)&servaddr, sizeof(struct sockaddr_in));
if(ret < 0)
{
printf("绑定服务器端口:%d失败
",SERVER_PORT);
exit(-1);
}
//步骤4:调用listen()函数将该TCP主套核字设为被动模式,并设置等待队列长度:
#define QUEUE 20
if(listen(msock,QUEUE)<0)
{
printf("监听失败!");
exit(-1);
}
//步骤5:调用accpet()函数从该TCP主套接字上接收一个新的客户 TCP连接请求,
//并在与该客户之间成功建立了TCP连接之后,为该TCP连接创建一一个新的从套接字
//(由该新的从套接字来负责与客户之间进行实际的通信);
SOCKET ssock;
struct sockaddr_in clientaddr;
int len = sizeof(clientaddr);
ZeroMemory(&clientaddr,sizeof(clientaddr));
ssock=accept(msock,(struct sockaddr*)&clientaddr,&len);
if(ssock==INVALID_SOCKET)
{
printf("接收数据失败
");
exit(-1);
}
//步骤6:基于新创建的从套接字,调用recv()函数利用 该从套接字读取客户端发送过来的数据并存入缓冲区;
char buf[my_BUFSIZ];
ZeroMemory(buf,sizeof(buf));
if(recv(ssock, buf, sizeof(buf), 0)<0)
{
printf("接收数据失败
");
exit(-1);
}
else
{
printf("已接受数据>>%s
",buf);
}
//步骤7:基于新创建的从套接字,调用send()函数将缓冲区中的数据利用该从套接字发送给该远程客户端;
//char *buffer="这里是服务器~";
char buffer[my_BUFSIZ];
printf("输入数据>>");
scanf("%s",buffer);
if(send(ssock,buffer,strlen(buffer),0)!=strlen(buffer))
{
printf("发送数据失败!");
exit(-1);
}
//步骤8:与客户交互完毕,调用closesocket()函数将该从套接字关闭,释放所占用的系统资源);
closesocket(ssock);
//步骤9:最后,当与所有客户交互完毕之后,调用closesocket()函数将TCP主套接字关闭,
//释放所古用的系统资源,然后,再调用WSACleanup()函数来结束Winsock Socket API
closesocket(msock);
WSACleanup();
system("pause");
return 0;
}
基于UDP的Linux通信
客户端:
#include <stdio.h>
#include <sys/socket.h>
#include <string.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <string.h>
int main()
{
printf("【客户端:目标IP 127.0.0.1,目标端口:23333】
");
//步骤1:调用socket()函数创建客户端UDP套接字;
int tsock;
tsock = socket(AF_INET,SOCK_DGRAM,0);
if(tsock < 0)
{
printf("创建套接字失败
");
exit(-1);
}
//步骤2:找到期望与之通信的远程服务器的IP地址和协议端口号,然后再调用sendto()函数将缓冲区中的数据从UDP套接字发送给远程服务器端;
#define SERVERIP "127.0.0.1"
#define SERVER_PORT 23333
char buffer[BUFSIZ];
memset(buffer,'