23Socket實現UDP伺服器端和用戶端串連傳輸

來源:互聯網
上載者:User

標籤:socket

用戶端
23UdpClient.cpp
代碼:
// 23UdpClient.cpp : 定義控制台應用程式的進入點。//#include "stdafx.h"#include <stdio.h>//Windows通訊端所需的標頭檔#include <WINSOCK.H>//Windows通訊端介面的庫檔案#pragma comment(lib, "WSOCK32.LIB")//程式使用的WinSock主要版本#define SOCK_VER 2//變數和函式宣告SOCKET g_sock = 0;void ErrMsg(DWORD dwErr);int _tmain(int argc, _TCHAR* argv[]){//初始化WinSock環境WSADATA wd = {0};int nStart = WSAStartup(MAKEWORD(SOCK_VER, 0), &wd);if(nStart = 0){//初始化失敗return 0;}//檢測當前系統的WinSock版本是否支援所需版本if(LOBYTE(wd.wVersion) != 2){return 0;}//建立一個UDP Socketg_sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);if(g_sock == INVALID_SOCKET){ErrMsg(WSAGetLastError());return 0;}printf("Socket建立成功\n");//發資料的目標地址sockaddr_in addr = {0};addr.sin_family = AF_INET;addr.sin_port = htons(2800);addr.sin_addr.s_addr = inet_addr("127.0.0.1");//發出資料包char szBuff[] = "hello UDP!";int nSent = sendto(g_sock, szBuff, strlen(szBuff) + 1, 0, (sockaddr *)&addr, sizeof(addr));if(nSent == 0)ErrMsg(WSAGetLastError());elseprintf("資訊成功發出,等待回應...\n");//等待回應sockaddr_in saServer = {0};int nFromLen = sizeof(saServer);*szBuff = '\0';int nRecv = recvfrom(g_sock, szBuff, 256, 0, (sockaddr *)&saServer, &nFromLen);if(SOCKET_ERROR == nRecv)ErrMsg(WSAGetLastError());elseprintf("收到回應:%s 從%s,%d\n", szBuff, inet_ntoa(saServer.sin_addr), ntohs(saServer.sin_port));//關閉通訊端closesocket(g_sock);//等待使用者輸入system("pause");//清理SOCKET環境WSACleanup();return 0;}//擷取錯誤詳細資料,並輸出void ErrMsg(DWORD dwErr){char szErr[1024] = {0};FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, dwErr, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), szErr, 1024, NULL);printf(szErr);}

VS2010下出現錯誤:
1>f:\program\vc++執行個體精通\23udpclient\23udpclient\23udpclient.cpp(75): error C2664: “FormatMessageW”: 不能將參數 5 從“char [1024]”轉換為“LPWSTR”1>          與指向的類型無關;轉換要求 reinterpret_cast、C 樣式轉換或函數樣式轉換
項目-屬性-常規-字元集:改為使用多位元組字元集重新編譯出現錯誤
1>LINK : fatal error LNK1123: 轉換到 COFF 期間失敗: 檔案無效或損壞

項目-屬性-配置 屬性-清單工具-輸入和輸出-嵌入清單:是改為否

編譯執行:


伺服器端
UdpServer.cpp代碼:

// 23UdpServer.cpp : 定義控制台應用程式的進入點。//#include "stdafx.h"#include <stdio.h>//使用WinSock所需的標頭檔#include <WINSOCK.H>//使用WinSock所需的庫檔案#pragma comment(lib, "WSOCK32.LIB")//程式中要使用的WinSock主要版本#define SOCK_VER 2//變數和函式宣告SOCKET g_sock = 0;void ErrMsg(DWORD dwErr);int _tmain(int argc, _TCHAR* argv[]){//初始化環境WSADATA wd = {0};int nStart = WSAStartup(MAKEWORD(SOCK_VER, 0), &wd);if(nStart = 0){return 0;}if(LOBYTE(wd.wVersion) != 2){return 0;}//建立SOCKETg_sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);if(g_sock == INVALID_SOCKET){ErrMsg(WSAGetLastError());return 0;}printf("Socket建立成功!\n");//綁定到連接埠28000sockaddr_in addr = {0};addr.sin_family = AF_INET;addr.sin_port = htons(2800);addr.sin_addr.s_addr = inet_addr("127.0.0.1");int nBind = bind(g_sock, (sockaddr *)&addr, sizeof(addr));if(nBind != 0){ErrMsg(WSAGetLastError());return 0;}//取得已綁定的連接埠號碼int nLen = sizeof(addr);getsockname(g_sock, (sockaddr *)&addr, &nLen);printf("Socket成功綁定到連接埠:%d,等待資料...\n", ntohs(addr.sin_port));//等待並接收資訊sockaddr_in saClient = {0};int nFromLen = sizeof(saClient);char szBuff[256] = {0};recvfrom(g_sock, szBuff, 256, 0, (sockaddr *)&saClient, &nFromLen);printf("收到資訊:‘%s’,從%s,%d\n", szBuff, inet_ntoa(saClient.sin_addr), ntohs(saClient.sin_port));//向用戶端發出回應strcpy(szBuff, "OK!");int nSent = sendto(g_sock, szBuff, strlen(szBuff) + 1, 0, (sockaddr *)&saClient, sizeof(saClient));if(nSent == 0)ErrMsg(WSAGetLastError());elseprintf("成功發出回應!\n");//關閉SOCKETclosesocket(g_sock);//等待使用者輸入system("pause");//清理環境WSACleanup();return 0;}//取得錯誤詳細情況,並輸出void ErrMsg(DWORD dwErr){char szErr[1024] = {0};FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, dwErr, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), szErr, 1024, NULL);printf(szErr);}
錯誤解決同用戶端程式的解決方案

編譯執行:

此時運行用戶端程式,伺服器端便可收到用戶端發來的資訊並作出回應:
用戶端收到伺服器端做出的回應:


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.