1. 程式人生 > >[C語言] Socket程式設計簡單例子/Client+Server

[C語言] Socket程式設計簡單例子/Client+Server

一、原理

=====1.基於TCP協議的伺服器端程式流程:=======
1)建立套接字(socket)
2)繫結套接字(bind)
3)將套接字設為監聽,準備接收客戶請求(listen)
4)等待客戶請求的到來,當請求到來後,接受請求,返回一個對應於此次連線的套接字(accept)
5)用返回的套接字與客戶端進行通訊(send/recv)
6)返回,等待另一客戶請求
7)關閉套接字
====2.基於TCP協議的客戶端程式流程:=======
1)建立套接字(socket)
2)向伺服器發出連線請求(connect)
3)和伺服器端進行通訊(send/recv)
4)關閉套接字
在伺服器端呼叫accept函式時,程式就會等待客戶端呼叫connect函式發出連線請求,然後接收請求,於是雙方就建立了連線,之後,伺服器端和客戶端就可以利用send和recv函式進行通訊了。

#define StartThread(thrFun) CloseHandle(CreateThread(NULL,0,thrFun,NULL,0,NULL))

DWORD WINAPI _FuncThread(LPVOID param); //供參考的全域性執行緒函式


======3.基於UDP的伺服器端編寫======
1)建立套接字(socket)
2)繫結(bind)
3)等待接收資料(recvfrom)
4)關閉套接字
4.基於UDP的客戶端編寫
1)建立套接字(socket)
2)向伺服器傳送資料(sendto)
3)關閉套接字
在所有的套接字程式設計中第一步都是載入套接字型檔(WSAStartup)
對於每一個WSAStartup函式的成功呼叫,在最後都要對應一個WSACleanUp呼叫。

二、原始碼:

1.TCP伺服器端:

#include <Winsock2.h>
#include <stdio.h>

int main()
{
 WORD wVersionRequested;
 WSADATA wsaData;
 int err;
 
 wVersionRequested = MAKEWORD( 1, 1 );
 
 err = WSAStartup( wVersionRequested, &wsaData );
 if ( err != 0 ) {
  return -1;
 }
 

 if ( LOBYTE( wsaData.wVersion ) != 1 ||
        HIBYTE(

 wsaData.wVersion ) != 1 ) {
  WSACleanup( );
  return -1; 
 }
 SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);

 SOCKADDR_IN addrSrv;
 addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
 addrSrv.sin_family=AF_INET;
 addrSrv.sin_port=htons(6000);

 bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));

 listen(sockSrv,5);

 SOCKADDR_IN addrClient;


 while(1)
 { //迴圈短連線

intlen=sizeof(SOCKADDR);
  SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);
  char sendBuf[500];
  sprintf(sendBuf,"Welcome %s link in....",
   inet_ntoa(addrClient.sin_addr));
  send(sockConn,sendBuf,strlen(sendBuf)+1,0);
  char recvBuf[500]={0};
  len=recv(sockConn,recvBuf,500,0);
  printf("\nRecv[%d] %s\n",len,recvBuf);
  closesocket(sockConn);
 }

WSACleanup();

   return 0 ;
}


2.TCP客戶端:

#include <Winsock2.h>
#include <stdio.h>

int main()
{
 WORD wVersionRequested;
 WSADATA wsaData;
 int err;
 
 wVersionRequested = MAKEWORD( 1, 1 );
 
 err = WSAStartup( wVersionRequested, &wsaData );
 if ( err != 0 ) {
  return -1;
 }
 

 if ( LOBYTE( wsaData.wVersion ) != 1 ||
        HIBYTE( wsaData.wVersion ) != 1 ) {
  WSACleanup( );
  return -1; 
 }
 SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);

 SOCKADDR_IN addrSrv;
 addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
 addrSrv.sin_family=AF_INET;
 addrSrv.sin_port=htons(6000);
 connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));

 char recvBuf[100];
 recv(sockClient,recvBuf,100,0);
 printf("%s\n",recvBuf);
 send(sockClient,"This is lisi",strlen("This is lisi")+1,0);

 closesocket(sockClient);
 WSACleanup();

  return 0;
}

3.UDP伺服器端