程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 揭開Socket編程的面紗(3)

揭開Socket編程的面紗(3)

編輯:關於C語言

在客戶端輸入服務器端的IP地址和發送的數據,然後按發送按鈕,服務器端接收到數據,然後回應客戶端。客戶端讀取回應的數據,顯示在界面上。

下面是接收數據和發送數據的函數:

int Receive(SOCKET fd,char *szText,int len)
{
    int cnt;
    int rc;
    cnt=len;
    while(cnt>0)
    {
       rc=recv(fd,szText,cnt,0);
       if(rc==SOCKET_ERROR)
       {
           return -1;
       }
       if(rc==0)
           return len-cnt;
       szText+=rc;
       cnt-=rc;
    }
    return len;
}
int Send(SOCKET fd,char *szText,int len)
{
    int cnt;
    int rc;
    cnt=len;
    while(cnt>0)
    {
       rc=send(fd,szText,cnt,0);
       if(rc==SOCKET_ERROR)
       {
           return -1;
       }
       if(rc==0)
           return len-cnt;
       szText+=rc;
       cnt-=rc;
    }
    return len;
}

服務器端:

在服務器端,主要是啟動Socket和監聽線程。

#define DEFAULT_PORT   2000
void CServerDlg::OnStart()
{
    sockaddr_in local;
    DWord dwThreadID = 0;
    local.sin_family=AF_INET;
    //設置的端口為DEFAULT_PORT。
    local.sin_port=htons(DEFAULT_PORT);
    //IP地址設置成INADDR_ANY,讓系統自動獲取本機的IP地址。
    local.sin_addr.S_un.S_addr=INADDR_ANY;

    //初始化Socket
    m_Listening = socket(AF_INET,SOCK_STREAM,0);
    if(m_Listening == INVALID_SOCKET)
    {
       return ;
    }
    //將本地地址綁定到所創建的套接字上
    if(bind(m_Listening,(LPSOCKADDR)&local,sizeof(local)) == SOCKET_ERROR )
    {
       closesocket(m_Listening);
       return ;
    }
    //創建監聽線程,這樣也能響應界面上操作。
    m_hListenThread = ::CreateThread(NULL,0,ListenThread,this,0,&dwThreadID);
    m_StartBtn.EnableWindow(FALSE);
    m_StopBtn.EnableWindow(TRUE);
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved