最简单的服务器和对应的客户端c语言实现,WinSock2简单的服务器与客户端(C语言实现)...

注: 如果使用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;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值