1. 程式人生 > >TCP客戶端程式(C語言)

TCP客戶端程式(C語言)

TCP客戶端程式,與TCP伺服器端配合使用

Visual Stdio執行

// TCP客戶端.cpp : 定義控制檯應用程式的入口點。
//
#include"stdafx.h"
#include<stdio.h>
#include<winsock2.h>
#include<iostream>
#pragma comment (lib,"ws2_32")
using namespace std;
int main()
{
	//WSA是web server API的簡寫

	WSADATA wsaData;
	//給WSAStartup初始化用的資料結構
	WSAStartup(MAKEWORD(2, 2), &wsaData);
	//MAKEWORD是合成一個字,用來表示版本資訊的
	//指向一個WSADATA的指標。
	SOCKET sServer = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
	//socket函式呼叫成功會返回一個套接字描述符,失敗則返回INVALID_SOCKET
	//呼叫socket時應該使用PF_INET (協議族)
	//指定新套接字描述符的型別  SOCK_STREAM是流套接字
	//指定應用程式所使用的通訊協議

	printf("socket create successfully\n");
	struct sockaddr_in ServerAddr;
	//sockaddr結構體是為了保持各個特定協議之間的相容性而設計的
	//是一個用來儲存地址資訊的結構體
	//為bind()函式指定地址和埠時,向sockaddr_in結構體填充相應的內容
	

	printf("init connect ...\n");


	ServerAddr.sin_family = AF_INET;
	ServerAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
	//inet_addr轉換函式把點分十進位制表示的IP地址轉換為in_addr結構體可以接受的型別
	ServerAddr.sin_port = htons(1234);
	//htons() 轉換位元組序
	int err_log=connect(sServer, (SOCKADDR *)&ServerAddr, sizeof(ServerAddr));
    //將套接字進行連線
		//建立好的套接字描述符
		//指向sockaddr結構體的指標。sockaddr結構體中儲存了伺服器的IP地址和埠號
		//指定sockaddr結構體的長度
	if(err_log==0) printf("connect successfully\n");

	char szMsg[MAXBYTE] = { 0 };
 

	recv(sServer, szMsg, MAXBYTE, 0);
    
	cout << szMsg << endl;
	//接受訊息
	//使用方法與send相同
	printf("Client Msg : %s \r\n", szMsg);


	lstrcpy(szMsg, "hello Server!\r\n");
	send(sServer, szMsg, strlen(szMsg) + sizeof(char), 0);


	WSACleanup();
	system("pause");
	return 0;
}