註釋筆記在代碼內:
服務器:
//以下均在VS2015 WINDOWS平臺編譯並運行
//在Linux中 頭文件爲:
//#incude<sys/socket.h>
//以下爲服務端代碼示例
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#pragma comment(lib, "ws2_32.lib")
#include<stdio.h>
#include<stdlib.h>
#include<WinSock2.h>
#define ser_port 8888 //端口號
void ErrorHandling(const char* message);
/*
argc爲參數個數
argv[]爲argc個參數,其中首個參數爲程序的全名
*/
int main(int argc, char* argv[])
{
WSADATA wsaData;
SOCKET hServerSock, hClntSock;
SOCKADDR_IN servAddr, clntAddr;
argc = 1;
int szClntAddr;
char message[] = "Hello World!";
/*
if (argc != 2)
{
printf("Usage :%s <port>\n", argv[0]);
exit(1);
}*/
/*
Winsock的初始化
MAKEWORD(2,2)返回值爲WORD,WORD爲套接字的版本信息,這裏爲主版本爲2,副版本爲2,返回0x0202;
第二個參數爲WSADATA類型參數的地址;
*/
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
ErrorHandling("WSAStartup() error!");
//創建套接字
hServerSock = socket(PF_INET, SOCK_STREAM, 0);
if (hServerSock == INVALID_SOCKET)
ErrorHandling("socket() error!");
memset(&servAddr, 0, sizeof(servAddr));
servAddr.sin_family = AF_INET;
servAddr.sin_addr.s_addr = htonl(INADDR_ANY);
servAddr.sin_port = htons(ser_port);
//bind()爲socker()函數創建的套接字分配IP地址和端口號
if (bind(hServerSock, (SOCKADDR*)&servAddr, sizeof(servAddr)) == SOCKET_ERROR)
ErrorHandling("bind() error!");
/*
listen() 服務器等待連接數據 開始監聽
*/
if (listen(hServerSock, 5) == SOCKET_ERROR)
ErrorHandling("listen() error!");
/*
accept()函數受理客戶端連接請求
*/
szClntAddr = sizeof(clntAddr);
hClntSock = accept(hServerSock, (SOCKADDR*)&clntAddr, &szClntAddr);
if (hClntSock == INVALID_SOCKET)
ErrorHandling("accept() error!");
/*
send()向accept()連接的客戶端傳輸數據
*/
send(hClntSock, message, sizeof(message), 0);
closesocket(hClntSock);
closesocket(hServerSock);
//終止前註銷WSAStarup()初始化的套接字庫
WSACleanup();
return 0;
}
void ErrorHandling(const char* message)
{
fputs(message, stderr);
fputc('\n', stderr);
exit(1);
}
客戶端:
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#pragma comment(lib, "ws2_32.lib")
#include <stdio.h>
#include <stdlib.h>
#include <WinSock2.h>
void ErrorHandling(const char* message);
int main(int argc, char *argv[]) {
WSADATA wsaData;
SOCKET hSocket;
SOCKADDR_IN servAddr;
char message[30];
int strlen;
/*
if (argc != 3) {
printf("Usage: %s <IP> <port>\n", argv[0]);
exit(1);
}*/
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
ErrorHandling("WSAStartup() error!");
hSocket = socket(PF_INET, SOCK_STREAM, 0);
if (hSocket == INVALID_SOCKET)
ErrorHandling("socket() error!");
memset(&servAddr, 0, sizeof(servAddr));
servAddr.sin_family = AF_INET;
servAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); //localhost,回送地址,本地測試用
servAddr.sin_port = htons(8888); //服務器端口號
//向服務器發送鏈接請求
if (connect(hSocket, (SOCKADDR*)&servAddr, sizeof(servAddr)) == SOCKET_ERROR)
ErrorHandling("connect() error!");
strlen = recv(hSocket, message, sizeof(message) - 1, 0);
if (strlen == -1)
ErrorHandling("read() error!");
printf("Message from server:%s\n", message);
closesocket(hSocket);
WSACleanup();
getchar();
return 0;
}
void ErrorHandling(const char * message) {
fputs(message, stderr);
fputc('\n', stderr);
exit(1);
}
注:
運行環境:windows 10 ,VisualStudio 2015
頭文件#include<winsock2.h>若初次運行請在配置屬性-輸入-附加依賴項中空白處直接寫入 ws2_32.lib 以連接ws2_32.lib庫
請先運行服務器代碼後再運行客戶端代碼
代碼:
https://github.com/ChristmasError/TCP-IP-Network-programming