本來不想寫這篇文章的,發現網上真很難找到windows下socket的編程的示例代碼。而自己又不能一下仔背過這么多的規范,雖然代碼不少也貼上來吧,代碼解析就先免一點了,有代碼而在網上找解析還是挺簡單的,以后也好找點~~
BOOL InitWinsock(){
int Error;
WORD VersionRequested;
WSADATA WsaData;
VersionRequested=MAKEWORD(2,2);
Error=WSAStartup(VersionRequested,&WsaData); //啟動WinSock2
if(Error!=0){
return FALSE;
}
else {
if(LOBYTE(WsaData.wVersion)!=2||HIBYTE(WsaData.wHighVersion)!=2){
WSACleanup();
return FALSE;
}
}
return TRUE;
}
可能其他方式也能實現,我會一種也差不多了,呵呵。
有點需要特別注意的,因為我用的是MinGW為C編譯器,所以編譯的時候需要加上-lwsock32的參數。
如: gcc server.c -o server -lwsock32
服務器端代碼:
#include<stdio.h>
#include<winsock.h>
#pragma comment (lib, "ws2_32.lib")
BOOL InitWinsock();
#include<winsock.h>
#pragma comment (lib, "ws2_32.lib")
BOOL InitWinsock();
void main(){
SOCKET socket1;
InitWinsock();
struct sockaddr_in local;
local.sin_family=AF_INET;
local.sin_port=htons(3490); ///監聽端口
local.sin_addr.s_addr=INADDR_ANY; ///本機
memset(local.sin_zero,0,8);
socket1=socket(AF_INET,SOCK_STREAM,0);
SOCKET socket1;
InitWinsock();
struct sockaddr_in local;
local.sin_family=AF_INET;
local.sin_port=htons(3490); ///監聽端口
local.sin_addr.s_addr=INADDR_ANY; ///本機
memset(local.sin_zero,0,8);
socket1=socket(AF_INET,SOCK_STREAM,0);
int bind_result = bind(socket1,(struct sockaddr*)&local,sizeof(local));
while (1){
int nlisten = listen(socket1, 10);
printf("Listening......\n");
struct sockaddr_in their_addr;
int nSize = sizeof(their_addr);
int nNewFd = accept(socket1, (struct sockaddr*)&their_addr, &nSize);
printf("Accepted! IP:%s: Port:%d\n", inet_ntoa(their_addr.sin_addr), ntohs(their_addr.sin_port));
Sleep(500);
}
closesocket(socket1);
}
while (1){
int nlisten = listen(socket1, 10);
printf("Listening......\n");
struct sockaddr_in their_addr;
int nSize = sizeof(their_addr);
int nNewFd = accept(socket1, (struct sockaddr*)&their_addr, &nSize);
printf("Accepted! IP:%s: Port:%d\n", inet_ntoa(their_addr.sin_addr), ntohs(their_addr.sin_port));
Sleep(500);
}
closesocket(socket1);
}
BOOL InitWinsock(){
int Error;
WORD VersionRequested;
WSADATA WsaData;
VersionRequested=MAKEWORD(2,2);
Error=WSAStartup(VersionRequested,&WsaData); //啟動WinSock2
if(Error!=0){
return FALSE;
}
else {
if(LOBYTE(WsaData.wVersion)!=2||HIBYTE(WsaData.wHighVersion)!=2){
WSACleanup();
return FALSE;
}
}
return TRUE;
}
客戶段代碼:
#include<stdio.h>
#include<winsock.h>
#pragma comment (lib, "ws2_32.lib")
BOOL InitWinsock();
#include<winsock.h>
#pragma comment (lib, "ws2_32.lib")
BOOL InitWinsock();
void main(){
SOCKET socket1;
InitWinsock();
struct sockaddr_in from;
struct sockaddr_in local;
local.sin_family = AF_INET;
local.sin_port = htons(888);
local.sin_addr.s_addr = INADDR_ANY;
int fromlen =sizeof (from);
SOCKET socket1;
InitWinsock();
struct sockaddr_in from;
struct sockaddr_in local;
local.sin_family = AF_INET;
local.sin_port = htons(888);
local.sin_addr.s_addr = INADDR_ANY;
int fromlen =sizeof (from);
socket1 = socket(AF_INET,SOCK_STREAM,0);
int nbind = bind(socket1,(struct sockaddr*)&local, sizeof(local));
if (nbind < 0){
printf("error");
exit(1);
}
int nbind = bind(socket1,(struct sockaddr*)&local, sizeof(local));
if (nbind < 0){
printf("error");
exit(1);
}
from.sin_family = AF_INET;
from.sin_port = htons(3490);
from.sin_addr.S_un.S_addr = inet_addr("10.10.110.249");
memset(from.sin_zero, 0, 8);
from.sin_port = htons(3490);
from.sin_addr.S_un.S_addr = inet_addr("10.10.110.249");
memset(from.sin_zero, 0, 8);
int nCon = connect(socket1, (struct sockaddr*)& from, sizeof (from));
if (nCon < 0){
printf("error");
exit(1);
}
if (nCon < 0){
printf("error");
exit(1);
}
}
BOOL InitWinsock(){
int Error;
WORD VersionRequested;
WSADATA WsaData;
VersionRequested = MAKEWORD(2,2);
Error = WSAStartup(VersionRequested, &WsaData);
if (Error != 0){
return FALSE;
}
else {
if(LOBYTE(WsaData.wVersion) != 2 || HIBYTE(WsaData.wHighVersion) != 2){
WSACleanup();
return FALSE;
}
}
return TRUE;
}
int Error;
WORD VersionRequested;
WSADATA WsaData;
VersionRequested = MAKEWORD(2,2);
Error = WSAStartup(VersionRequested, &WsaData);
if (Error != 0){
return FALSE;
}
else {
if(LOBYTE(WsaData.wVersion) != 2 || HIBYTE(WsaData.wHighVersion) != 2){
WSACleanup();
return FALSE;
}
}
return TRUE;
}