socket通信c语言实现

2024-08-10 版权声明 我要投稿

socket通信c语言实现(精选5篇)

socket通信c语言实现 篇1

#include

#include

void main()

{

WORDwVersionRequested;

WSADATA wsaData;

int err;

wVersionRequested = MAKEWORD(1,1);

err = WSAStartup(wVersionRequested,&wsaData);

if( err != 0)

{

return;

}

if(LOBYTE( wsaData.wVersion ) != 1||

HIBYTE( wsaData.wVersion) != 1)

{

WSACleanup();

return;

}

SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);

SOCKADDR_IN addrSrv;

addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);

addrSrv.sin_family=AF_INET;

addrSrv.sin_port=htons(6000);

bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));

listen(sockSrv,5);

SOCKADDR_IN addrClient;

int len=sizeof(SOCKADDR);

while(1)

{

SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);

char sendBuf[100];

sprint(sendBuf,”Welcome %s to www.sunxin.org“,

inet_ntoa(addrClient.sin_addr));

send(sockConn,sendBuf,strlen(sendBuf)+1,0);

char recvBuf[100];

recv(sockConn,recvBuf);

printf(“%sn”,recvBuf);

closesocket(sockConn);

WSACleanup();

}

}

注:这是Server端;File->New->Win32 Console Application,工程名:TcpSrv;然后,File->New->C++ Source File,文件名:TcpSrv;在该工程的`Setting的Link的Object/library modules项要加入ws2_32.lib

#include

#include

void main()

{

WORDwVersionRequested;

WSADATA wsaData;

int err;

wVersionRequested = MAKEWORD(1,1);

err = WSAStartup(wVersionRequested,&wsaData);

if( err != 0)

{

return;

}

if(LOBYTE( wsaData.wVersion ) != 1||

HIBYTE( wsaData.wVersion) != 1)

{

WSACleanup();

return;

}

SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);

SOCKADDR_IN addrSrv;

addrSrv.sin_addr.S_un.S_addr=inet_addr(“127.0.0.1″);

addrSrv.sin_family=AF_INET;

addrSrv.sin_porthtons(6000);

connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));

char recvBuf[100];

recv(sockClient,recvBuf,100,0);

printf(“%sn”,recvBuf);

send(sockClient,”This is zhangsan”,strlen(“This is zhangsan”)+1,0);

closesocket(sockClient);

WSACleanup();

}

socket通信c语言实现 篇2

Socket就是套接字的英文名称,主要是用于网络通信编程,套接字是通信的基石,是支待TCP/IP协议的网络通信的本操作单元。可以将套接字看作不同主机间的进程进行双向通信的端点,在TCP/IP网络中,传送和接收数据就会经常使用到Socket,由于使用Socket能够在网络上处理复杂数据,所以在各种网络应用程序中,涉及到数据传送和接收,一般都会使用Socketㄢ

Visual C#是一种简洁、类型安全的面向对象的语言,开发人员可以使用它来构建在.NET Framework上运行的各种安全、可靠的应用程序。C#语法简化了C++的诸多复杂性,提供很强的网络编程功能。Visual C#通过Socket的托管来实现网络通信。

1、socket通信机制

1.1 Socket套接字工作原理

根据连接启动的方式以及本地套接字要连接的目标,套接字之间的连接过程可以分为三个步骤:服务器监听,客户端请求,连接确认。

所谓服务器监听,是服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态。

所谓客户端请求,是指由客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。

所谓连接确认,是指当服务器端套接字监听到或者说接收到客户端套接字的连接请求,它就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,连接就建立好了。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。

2、C#中socket编程实现

Visual C#主要网络功能主要使用.Net FrameWork SDK中的提供的二个命名空间"System.Net.Sockets"和"System.Net"。而实现Socket使用的是命名空间"System.Net.Sockets"中的Socket类。在.Net中,System.Net.Sockets命名空间为需要严密控制网络访问的开发人员提供了Windows Sockets (Winsock) 接口的托管实现。.Net类可以视为包含3个层次:请求/响应层、应用协议层、传输层。Socket类处于传输层。System.Net命名空间中的所有其他网络访问类都建立在该套接字Socket实现之上。Visual C#通过创建Socket类的实例来实现Socket的托管。

在Visual C#中首先创建Socket对象的实例,创建完Socket实例后,可以通过此Socket实例的Bind方法绑定到网络中指定的终结点,也可以通过其Connect方法向指定的终结点建立的连接。连接创建完毕,就可以使用其Send或SendTo方法将数据发送到Socket;同样使用其的Receive或ReceiveFrom方法从Socket中读取数据。在Socket使用完毕后,请使用其的Shutdown方法禁用Socket,并使用Close方法关闭Socketㄢ

3、多线程技术

多线程是和进程联系在一起的,进程是应用程序执行实例,线程是Win32的最小执行单元,一个进程可以有多个线程,其中一个为主线程。进程是系统资源分配的基本单位,而线程是系统处理器分配的基本单元,一个进程中的多个线程可以同时执行代码。当然实际上只是处理器在各个线程间频繁地切换,给人的感觉是好象同时执行的。在利用多线程进行程序设计时,要充分考虑到并发性、安全性等问题,才能提高程序及系统的效率,发挥出多任务并行的高效性。

4、基于C/S的网络五子棋程序开发设计

4.1 系统分析

程序采用了面向对象技术开发,分为服务端和客户端,服务端作为一个平台采用多线程技术为多个客户端服务,实现:消息传送、胜负判定、管理客户端连接。客户端在连接服务端后为用户提供落子、聊天、实现悔棋等功能提供界面和交互功能。能从服务端接收各类信息进行处理反馈给用户。如图1所示。

4.2 系统设计

4.2.1 服务端功能模块

服务端程序主类服务响应类。主要负责游戏的具体功能实现,并通过消息功能对象控制所有客户端的同步。主要功能如下:

(1)连接管理功能

当服务端开始运行时,首先实例化一个有服务响应对象,并启动一个新线程来调用监听方法,负责监听客户端连接、并另起一个线程检测到键盘输入exit时结束程序。

(2) 游戏功能

本功能又分为以下几个部分:

开局:识别并设置黑白双方玩家及旁观者身份,如是旁观者,则将信息栈里的棋局信息发送给旁观者。

当客户端连接,并请求开局时,判断是否还未确定黑白方。如还未确定,则随机指定黑或者白方为当前请求客户端。然后等待下一个开局请求,作为另一方。当双方都就绪时,游戏开始。

认输:如当前是游戏进行状态,则广播认输信息给所有客户端,并结束游戏。

求和/悔棋:如当前是游戏进行状态,则向游戏另一方玩家发送求和/悔棋询问。当返回允许操作时,则做相应处理。反之,不处理。

玩家逃跑:如当前是游戏进行状态,有客户端连接断开,则判断该客户端是否是游戏中的双方。如是,则广播玩家逃跑,游戏结束。反之,不处理。

聊天:只要是连接到服务端的客户端均可聊天,因为本程序未做用户模块,故所有聊天信息会冠以IP+端口号的形式,如:[127.0.0.1:6421]。

胜负判定:棋盘上有当前行棋方的任意五颗棋子连成一线时,即为判胜

4.2.2 消息处理类

本类是服务端和客户端的沟通管道。主要处理接收客户端发送的各类请求,如:连接请求、开局请求、落子请求、认输请求、求和请求、悔棋请求等,在收到这些请求时可以调用服务响应对象提供服务。主要功能是消息处理:当收到客户端消息时,将数据包得到之后,通过委托方法转换成可以识别的信息。再调用相应的服务。

4.2.3 客户端功能模块

主界面类,本类是游戏和用户唯一直接交互的类,用于接受用户鼠标键盘等的输入,并将落子信息、聊天消息通过Socket接口用数据包发送给服务端进行处理,并接受服务端处理结果的反馈显示给用户。

对于旁观者客户端,会接收从服务端返回是否已开局的信息,如未开局,可以选择开局。反之,则接收当前棋局的状态。

4.2.4 系统实施中的委托

protected delegate void StartDelegate (int ChessColor) ;//开局委托

protected delegate void DownDelegate (string DownInfo) ;//落子委托

protected delegate void StopDelegate (string Content) ;//游戏结束委托

protected delegate void RetryDelegate (string Content) ;//重新落子委托

protected delegate void OldHistoryDelegate (string Content) ;//获取棋局历史委托

protected delegate void StandoffDelegate (string Content) ;//和局委托

protected delegate void PleaMessageDelegate (string Content) ;//求和委托

protected delegate void SystemMessageDelegate (string Content) ;//系统消息委托

protected delegate void BackDelegate (string Content) ;//请求悔棋消息委托

protected delegate void FeeBDelegate (string Content) ;//同意悔棋消息委托

protected delegate void SDwnDelegate (string Content) ;//特许落子消息委托

protected delegate void FobnDelegate (string Content) ;//获取服务参数消息委托

5、小结

本文介绍了套接字的基本概念和实现套接字编程的基本原理,以及在C#下进行套接字编程的实现方法。并应用C#托管socket技术开发网络五子棋,使用Socket与多线程机制相结合的机制,编写多客户端与服务器的并发通信程序。编写基于C/S的网络程序方法很多,但使用C#-Socket套接字多线程开发模式,简化了代码,开发更加方便快捷。

参考文献

[1].李兰友, 杨晓光.Visual C#.Net程序设计.清华大学出版社[M].2004-4

[2].刘光蓉.运用Visual C++构建基于Socket的C/S模式通信[J].武汉工业学院学报, 2004, 23[3]:29-31.

[3].何进, 谢松巍.基于Socket的TCP/IP网络通讯模式研究[C].计算机应用研究, 2001, 8:134-135.

[4].张莹, 于重重, 刘杰.基于.Net Socket局域网多机校时的设计与实现[J].微计算机信息, 2007, 2-3:145-146

socket通信原理 篇3

服务器端的步骤如下。

(1)首先,在实用Socket之前,要首先初始化Socket,就是实用AfxSocketInit()函数。

(2)在初始化完成以后,就可以建立服务端的Socket,然后实用该Sokcet开始侦听整个网络中的连接请求。

(3)当检测到来自客户端的连接请求时,向客户端发送收到连接请求的信息,并建立与客户端之间的连接。连接的过程中,在MFC的框架中会触发一个前面创建的服务端Socket的消息响应函数OnAccept(),我们将建立的连接的代码放到该响应函数里面,在建立连接的过程中,会产生一个新的Socket,我们使用找个Socket来进行数据的通信。

(4)在通信的过程中,服务器端的产生的新的Socket会通过一个消息响应函数OnReceive()来接受到达的数据。数据的发送可以使用Send()来完成(5)当完成通信后,服务器关闭与客户端的Socket连接。

客户端的步骤如下。

(1)同样的,初始化Socket,并建立客户端的Socket,确定要连接的服务器的主机名和端口。

(2)发送连接请求到服务器(MFC中使用Connect()),并等待服务器的回馈信息。

(3)连接成功后,与服务器进行数据的交互。

(4)数据的读取同服务端一样,也是通过OnReceive()来完成的,数据的发送通过Send()即可。

(5)数据处理完毕后,关闭自身的Socket连接。

C语言中trim的实现 篇4

作者:老包米

描述

自己用ATL写了个COM,不支持MFC,所以无法用CString,但支持C编码,遇到字符串(字符数组),想去掉字符串中的空格,C下没有TRIM函数,找又没找到,几行代码自己写吧,往后大家万一遇到用着也方便。

说明

1.seps是需要去除的字符数组,可以有几个字符,也可以一个。这里是空格,最常用的。

2.参数也很简单,第一个是结果数组指针,第二个是原字符数组指针,第三个是需要去掉的字符数组指针。返回的是结果数组指针。

源代码

#include “stdafx.h”#include #include char seps[] = “ ”;char* trim(char* desc,char* src,char* seps);int main(int argc, char* argv[]){char szResult[1024]=“”;memset(szResult,0,1024);char strtemp[]=“ab c d e f”;printf( “%snnTokens:n”, strtemp );trim(szResult,strtemp,seps); printf( “result:%s(ok!)n”, szResult );return 0;}//////////////////////////////////////////////////////char* trim(char* desc,char* src,char* seps){char* token=NULL; /* Establish string and get the first token: */ token = strtok(src, seps); while( token != NULL ) {/* While there are tokens in “string” */printf( “ %sn”, token ); strcat(desc,token);/* Get next token: */token = strtok( NULL, seps ); } return desc;}

socket通信c语言实现 篇5

#include #define N 64

lfsr(int a,int b,int c,int d,int T[]);void main(){ int A[19]={1,0,1,1,0,0,1,1,0,0,0,0,1,0,1,0,1,0,1};

int B[22]={0,0,1,0,0,0,1,1,1,0,0,1,0,0,1,0,1,0,1,0,1,1};int C[23]={1,0,0,0,1,0,1,1,0,1,0,0,1,0,0,0,1,0,1,0,1,0,1};for(int i=0;i

{

printf(“%d”,A[18]^B[21]^C[22]);

lfsr(13,16,17,18,A);

lfsr(12,16,20,21,B);

lfsr(17,18,21,22,C);} else if(j==1)

{

printf(“%d”,A[18]^B[21]^C[22]);

if(A[9]==0)

lfsr(13,16,17,18,A);

if(B[11]==0)

lfsr(12,16,20,21,B);

if(C[11]==0)

lfsr(17,18,21,22,C);} else if(j==2)

{

printf(“%d”,A[18]^B[21]^C[22]);

if(A[9]==1)

lfsr(13,16,17,18,A);

if(B[11]==1)

lfsr(12,16,20,21,B);

if(C[11]==1)

lfsr(17,18,21,22,C);} else if(j==3)

{

printf(“%d”,A[18]^B[21]^C[22]);

lfsr(13,16,17,18,A);

lfsr(12,16,20,21,B);

lfsr(17,18,21,22,C);

} } printf(“n n”);} lfsr(int a,int b,int c,int d,int T[]){

int i;

for(i=d;i>0;i--)

{

T[i]=T[i-1];

}

T[0]=T[a]^T[b]^T[c]^T[d];

return(T[0]);} 密钥流:

A[19]={1,0,1,1,0,0,1,1,0,0,0,0,1,0,1,0,1,0,1};

B[22]={0,0,1,0,0,0,1,1,1,0,0,1,0,0,1,0,1,0,1,0,1,1};C[23]={1,0,0,0,1,0,1,1,0,1,0,0,1,0,0,0,1,0,1,0,1,0,1};密钥流序列:

上一篇:伞下的父爱作文550字下一篇:500字检讨书考的不好