標籤: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);}錯誤解決同用戶端程式的解決方案
編譯執行:
此時運行用戶端程式,伺服器端便可收到用戶端發來的資訊並作出回應:
用戶端收到伺服器端做出的回應: