注: 如果使用MinGW编译,加上选项-lwsock32,否则因为MinGW与VC库调用函数约定不同,其函数符号也不同,无法找到windows SDK
中的ws2_32.lib中相应的函数符号。使用此选项则调用MinGW提供的winsock库。-m32指示将目标文件编译成32位程序。
client 客户端:
#undef UNICODE
/*
author : ez
date : 2015/7/11
describe : a tcp socket server
this code only run on windows platform
note : if you use MinGW to compile, please enter:
mingw32-gcc -o client client.c -m32 -lwsock32
-m32 option specified your target PE form is 32bits
*/
#define WIN32_LEAN_AND_MEAN
#define _WIN32_WINNT 0x501
#include
#include
#include
#include
#pragma comment (lib, "ws2_32.lib")
#define DEFAULT_BUFLEN 0x100
#define DEFAULT_PORT 9003
#define DEFAULT_ADDR "127.0.0.1"
typedef char byte;
byte recvbuf [DEFAULT_BUFLEN];
int main (int argc, char* argv []) {
WSADATA wsaData;
int res;
SOCKET srv_socket = INVALID_SOCKET;
SOCKET client_socket = INVALID_SOCKET;
// defined in
// struct sockaddr *result = NULL;
struct sockaddr_in hints;
int sent_len = 0;
int recv_len = DEFAULT_BUFLEN;
// Initialize Winsock
res = WSAStartup (MAKEWORD (2,2), &wsaData);
if (res != 0) {
printf("WSAStartup fault, error return : %d\n", WSAGetLastError ());
return 1;
}
memset (&hints, 0, sizeof (struct sockaddr));
hints.sin_family = AF_INET;
hints.sin_port = htons (DEFAULT_PORT);
hints.sin_addr.s_addr = inet_addr (DEFAULT_ADDR);
// create socket
srv_socket = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (srv_socket == INVALID_SOCKET) {
printf ("Socket falhou, error: %ld\n", WSAGetLastError ());
WSACleanup();
return 1;
}
// bind socket to loopback ip
res = bind (srv_socket, (const struct sockaddr*) &hints, sizeof (struct sockaddr));
if (res == SOCKET_ERROR) {
printf("Fault to bind interface, error: %d\n", WSAGetLastError ());
closesocket (srv_socket);
WSACleanup();
return 1;
}
printf ("start listening... \n");
res = listen (srv_socket, SOMAXCONN);
if (res == SOCKET_ERROR) {
printf ("listen fault, error: %d\n", WSAGetLastError ());
closesocket (srv_socket);
WSACleanup ();
return 1;
}
client_socket = accept (srv_socket, NULL, NULL);
if (client_socket == INVALID_SOCKET) {
printf ("failed to accept a client, error: %d\n", WSAGetLastError ());
closesocket (srv_socket);
WSACleanup ();
return 1;
}
closesocket (srv_socket);
do {
res = recv (client_socket, recvbuf, recv_len, 0);
if (res > 0) {
printf ("%d Bytes received : %s\n", res, (char*) recvbuf);
sent_len = send ( client_socket, recvbuf, res, 0);
if (sent_len == SOCKET_ERROR) {
printf ("send error, error: %d\n", WSAGetLastError ());
closesocket (client_socket);
WSACleanup ();
return 1;
}
printf("Bytes sent: %d\n", sent_len);
}
else if (res == 0)
printf ("receive no data ...\n");
else {
printf("Fault to receive data, error: %d\n", WSAGetLastError ());
closesocket (client_socket);
WSACleanup ();
return 1;
}
} while (res > 0);
// shutdown socket send buffer
res = shutdown (client_socket, SD_SEND);
if (res == SOCKET_ERROR) {
printf ("shutdown fault, error: %d\n", WSAGetLastError ());
closesocket (client_socket);
WSACleanup ();
return 1;
}
// Close socket
closesocket (client_socket);
WSACleanup ();
return 0;
}Server 服务端:
/*
author : ez
date : 2015/7/12
describe : a simple client with w32 socket2
this code only run on windows platform
note : if you use MinGW to compile, please enter:
mingw32-gcc -o client client.c -m32 -lwsock32
-m32 option specified your target PE form is 32bits
*/
#define WIN32_LEAN_AND_MEAN
#define _WIN32_WINNT 0x501
#include
#include
// #include
#include
#include
#pragma comment (lib, "WS2_32.lib")
/*
#pragma comment (lib, "Mswsock.lib")
#pragma comment (lib, "AdvApi32.lib")
*/
#define DEFAULT_BUFLEN 512
#define DEFAULT_PORT 9003 // REMOTE PORT
#define DEFAULT_ADDR "127.0.0.1" // server address
#ifndef MAKEWORD
#define MAKEWORD(a, b) ((WORD)(((BYTE)(((DWORD_PTR)(a)) & 0xff)) | ((WORD)((BYTE)(((DWORD_PTR)(b)) & 0xff))) << 8))
#endif // ~MAKEWORD
typedef char byte;
byte recvbuf [DEFAULT_BUFLEN];
int main(int argc, char *argv []) {
WSADATA wsaData;
SOCKET conn_sock = INVALID_SOCKET;
struct sockaddr_in hints;
char *sendbuf = "send data from client... ";
int res;
// Initialize Winsock
res = WSAStartup(MAKEWORD(2,2), &wsaData);
if (res != 0) {
printf("WSAStartup fault, error: %d\n", res);
return 1;
}
memset (&hints, 0, sizeof (struct sockaddr_in));
hints.sin_family = AF_INET;
hints.sin_port = htons (DEFAULT_PORT);
hints.sin_addr.s_addr = inet_addr (DEFAULT_ADDR);
conn_sock = socket (AF_INET, SOCK_STREAM,
IPPROTO_TCP);
if (conn_sock == INVALID_SOCKET) {
printf ("Socket fault, error: %ld\n", WSAGetLastError ());
WSACleanup ();
return 1;
}
// connect to server
res = connect ( conn_sock, (struct sockaddr*) &hints, sizeof (struct sockaddr));
if (res == SOCKET_ERROR) {
closesocket (conn_sock);
conn_sock = INVALID_SOCKET;
}
// send data to server
res = send (conn_sock, sendbuf, (int) strlen (sendbuf), 0);
if (res == SOCKET_ERROR) {
printf("fail sending, error: %d\n", WSAGetLastError ());
closesocket (conn_sock);
WSACleanup ();
return 1;
}
printf ("Bytes Sent: %ld\n", res);
// receive from server
do {
res = recv (conn_sock, recvbuf, DEFAULT_BUFLEN, 0);
if ( res > 0 )
printf ("Bytes received: %d\n", res);
else if ( res == 0 )
printf ("no bytes received\n");
else
printf ("received fault, error: %d\n", WSAGetLastError ());
} while (res > 0);
shutdown (conn_sock, SD_BOTH);
closesocket (conn_sock);
WSACleanup();
return 0;
}