目录
首先可以用vs新建两个控制台项目,一个作为客户端,一个作为服务器,代码分别如下:
1、TCP Server
#include <winsock2.h> ///server
#include <mswsock.h>
#include <iostream>
using namespace std;
#pragma comment(lib, "ws2_32.lib")
#pragma comment(lib, "mswsock.lib")
DWORD IniSOCKDLL()
{
WORD wVersionRequested;
WSADATA wsaData;
int err = 0;
wVersionRequested = MAKEWORD(2, 2);
err = WSAStartup(wVersionRequested, &wsaData);
return err;
}
int main(int argc, char* argv[])
{
cout << "程序开始" << endl;
IniSOCKDLL();
SOCKET ss = WSASocket(AF_INET,
SOCK_STREAM,
0,
NULL,
0,
NULL);
SOCKADDR_IN addr;
int len;
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = htonl(INADDR_ANY);
addr.sin_port = htons(1002);
len = sizeof(addr);
bind(ss, (PSOCKADDR)&addr, len);
listen(ss, 5);
SOCKET sc = accept(ss, (PSOCKADDR)&addr, &len);
char buff[1024];
ZeroMemory(buff, 1024);
recv(sc, buff, 1024, 0);
cout << buff << endl;
ZeroMemory(buff, 1024);
memcpy(buff, "123", 3);
send(sc, buff, 3, 0);
closesocket(sc);
closesocket(ss);
return 0;
}
2、TCP Server (Select)
#include <winsock2.h> ///server
#include <mswsock.h>
#include <iostream>
using namespace std;
#pragma comment(lib, "ws2_32.lib")
#pragma comment(lib, "mswsock.lib")
DWORD IniSOCKDLL()
{
WORD wVersionRequested;
WSADATA wsaData;
int err = 0;
wVersionRequested = MAKEWORD(2, 2);
err = WSAStartup(wVersionRequested, &wsaData);
return err;
}
int main(int argc, char* argv[])
{
cout << "程序开始" << endl;
IniSOCKDLL();
SOCKET ss = WSASocket(AF_INET, SOCK_STREAM, 0, NULL, 0, NULL);
SOCKADDR_IN addr;
int len;
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = htonl(INADDR_ANY);
addr.sin_port = htons(1002);
len = sizeof(addr);
bind(ss, (PSOCKADDR)&addr, len);
listen(ss, 5);
SOCKET sockAccept;
int iResult;
int i;
fd_set fd;
FD_ZERO(&fd);
FD_SET(ss, &fd);
// 超时时间
// timeval tm;
// tm.tv_sec = 0;
// tm.tv_usec = 1000;
while (1) {
fd_set readfd = fd;
iResult = select(0, &readfd, NULL, NULL, /*&tm*/NULL);
if (0 <= iResult) {
for(i = 0; i < fd.fd_count; i++) {
if (FD_ISSET(fd.fd_array[i], &readfd)) {
//如果socket是服务器,则接收连接
if (fd.fd_array[i] == ss) {
sockAccept = accept(ss, (PSOCKADDR)&addr, &len);
if (INVALID_SOCKET != sockAccept) {
FD_SET(sockAccept, &fd);
}
} else {
//非服务器,接收数据(因为fd是读数据集)
char buff[1024];
ZeroMemory(buff, 1024);
int iRecvSize = recv(sockAccept, buff, 1024, 0);
cout << buff << endl;
if (SOCKET_ERROR == iRecvSize) {
closesocket(fd.fd_array[i]);
FD_CLR(fd.fd_array[i], &fd);
i--;
continue;
}
if (0 == iRecvSize) {
closesocket(fd.fd_array[i]);
FD_CLR(fd.fd_array[i],&fd);
i--;
}
}
}
}
} else if (SOCKET_ERROR == iResult) {
Sleep(100);
}
}
closesocket(ss);
return 0;
}
3、TCP Client
#include <winsock2.h> ///client
#include <mswsock.h>
#include <iostream>
using namespace std;
#pragma comment(lib, "ws2_32.lib")
#pragma comment(lib, "mswsock.lib")
DWORD IniSOCKDLL()
{
WORD wVersionRequested;
WSADATA wsaData;
int err = 0;
wVersionRequested = MAKEWORD(2, 2);
err = WSAStartup(wVersionRequested, &wsaData);
return err;
}
int main(int argc, char* argv[])
{
IniSOCKDLL();
SOCKET sc = WSASocket(AF_INET,
SOCK_STREAM,
0,
NULL,
0,
NULL);
SOCKADDR_IN addr;
int len;
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr("127.0.0.1");
addr.sin_port = htons(1002);
len = sizeof(addr);
connect(sc, (struct sockaddr *)&addr, len);
char buff[1024];
ZeroMemory(buff, 1024);
memcpy(buff, "123", 3);
send(sc, buff, 3, 0);
recv(sc, buff, 1024, 0);
cout << buff << endl;
closesocket(sc);
return 0;
}
4、UDP Server
#include <winsock2.h> ///server
#include <mswsock.h>
#include <iostream>
using namespace std;
#pragma comment(lib, "ws2_32.lib")
#pragma comment(lib, "mswsock.lib")
DWORD IniSOCKDLL()
{
WORD wVersionRequested;
WSADATA wsaData;
int err = 0;
wVersionRequested = MAKEWORD(2, 2);
err = WSAStartup(wVersionRequested, &wsaData);
return err;
}
int main(int argc, char* argv[])
{
cout << "程序开始" << endl;
IniSOCKDLL();
SOCKET ss = WSASocket(AF_INET,
SOCK_DGRAM,
0,
NULL,
0,
NULL);
SOCKADDR_IN addr;
int len;
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr("127.0.0.1");
addr.sin_port = htons(1002);
len = sizeof(addr);
bind(ss, (PSOCKADDR)&addr, len);
char buff[1024];
ZeroMemory(buff, 1024);
recvfrom(ss, buff, 1024, 0, (PSOCKADDR)&addr, &len);
cout << buff << endl;
ZeroMemory(buff, 1024);
memcpy(buff, "123", 3);
sendto(ss, buff, 3, 0, (PSOCKADDR)&addr, len);
closesocket(ss);
return 0;
}
5、UDP Client
#include <winsock2.h> ///client
#include <mswsock.h>
#include <iostream>
using namespace std;
#pragma comment(lib, "ws2_32.lib")
#pragma comment(lib, "mswsock.lib")
DWORD IniSOCKDLL()
{
WORD wVersionRequested;
WSADATA wsaData;
int err = 0;
wVersionRequested = MAKEWORD(2, 2);
err = WSAStartup(wVersionRequested, &wsaData);
return err;
}
int main(int argc, char* argv[])
{
IniSOCKDLL();
SOCKET sc = WSASocket(AF_INET,
SOCK_DGRAM,
0,
NULL,
0,
NULL);
SOCKADDR_IN addr;
int len;
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr("127.0.0.1");
addr.sin_port = htons(1002);
len = sizeof(addr);
char buff[1024];
memcpy(buff, "123", 3);
sendto(sc, buff, 3, 0, (PSOCKADDR)&addr, len);
ZeroMemory(buff, 1024);
recvfrom(sc, buff, 1024, 0, (PSOCKADDR)&addr, &len);
cout << buff << endl;
closesocket(sc);
return 0;
}