C语言版Socket通信原理

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

简单的客户/服务器程序设计与实现

实验目的及要求:

1、熟悉C编程环境。

2、熟悉Socket编程原理,掌握简单的套接字编程。

实验设备:

硬件:PC机

软件:CodeBlocks

实验内容及步骤:

什么是Socket?

Socket 英文直译为“孔或插座”,也称为套接字。用于描述IP 地址和端口号,是一种进程间的通信机制。你可以理解为IP 地址确定了网内的唯一计算机,而端口号则指定了将消息发送给哪一个应用程序(大多应用程序启动时会主动绑定一个端口,如果不主动绑定,操作系统自动为其分配一个端口)。

Socket 的类型

Stream:一种流式Socket,针对于面向连接的TCP 服务应用,安全,但效率低。(本文重点)

Datagram:数据报式的Socket,针对于无连接的UDP 服务应用,不安全(丢失、顺序混乱,往往在接收端要分析完整性、重排、或要求重发),但效率高。

Socket 程序一般应用模式及运行流程

服务器端会启动一个Socket,开始监听端口,监听客户端的连接信息,我们称之为Watch Socket。

客户端Socket 连接服务器端的监听Socket,一旦成功连接,服务器端会立刻创建一个新的Socket 负责与客户端进行通信,之后,客户端将不再与Watch Socket 通信。

Watch Socket 继续监听可能会来自其他客户端的连接。

上述过程就像是实现了一次三方会谈。服务器端的Socket 至少会有 2 个。一个是Watch Socket,每成功接收到一个客户端的连接,便在服务器端创建一个通信Socket。客户端Socket 指定要连接的服务器端地址和端口,创建一个Socket 对象来初始化一个到服务器的TCP 连接。

编写用TCP协议实现的Client端和Server端程序并调试通过。

程序分两部分:客户程序和服务器程序。

工作过程是:服务器首先启动,它创建套接字之后等待客户的连接;客户启动后创建套接字,然后和服务器建立连接;建立连接后,客户接收键盘输入,然后将数据发送到服务器,服务器收到到数据后,将接收到的字符在屏幕上显示出来。或者服务器接收键盘输入,然后将数据发送到客户机,客户机收到数据后,将接收到的字符在屏幕上显示出来。

服务器端代码:

#include

#include

#pragma comment (lib, "ws2_32")

#define N 20

struct stu

{

char no[20];

char name[20];

}d[N];

int fd(char *stum,int n)

{

int i,j;

FILE *fp;

char* res="";

fp=fopen("D:\\student.txt","r");

for( i=0;i

fscanf(fp,"%s\t%s",&d[i].no,&d[i].name);

fclose(fp);

for( j=0;j

{

if(strcmp(d[j].no,stum)==0)

{res=d[j].name;

break;}

res="no this student!";

}

return res;

}

int stuno()

{

FILE *fp;

fp=fopen("D:\\student.txt","r");

int i=1;

char c;

while(!feof(fp)){

while(c=='\n')

{

i++;

break;

}

c=fgetc(fp);

continue;

}

fclose(fp);

return i;

}

int main()

{

WSADATA wsaData;

WSAStartup(MAKEWORD(2, 2), &wsaData);

SOCKET s=socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);

struct sockaddr_in sockaddr;

sockaddr.sin_family=PF_INET;

sockaddr.sin_addr.S_un.S_addr=inet_addr("192.168.1.118");

sockaddr.sin_port=htons(8000);

bind(s, (SOCKADDR*)&sockaddr, sizeof(SOCKADDR));

listen(s, 1);

printf("listening on port [%d].\n", 8000);

int i=stuno();

printf("%d",i);

while(TRUE)

{

SOCKADDR clientAddr;

int size=sizeof(SOCKADDR);

SOCKET clientsocket;

clientsocket=accept(s, &clientAddr, &size);

printf("***SYS*** New client touched.\n");

char* msg="Hello, my client.\r\n";

send(clientsocket, msg, strlen(msg)+sizeof(char), NULL);

printf("***SYS*** HELLO.\n");

while(TRUE)

{

char buffer[MAXBYTE]={0};

recv(clientsocket, buffer, MAXBYTE, NULL); printf("***Client*** %s\n", buffer);

char* msg2=fd(buffer,i);

send(clientsocket, msg2, strlen(msg)+sizeof(char), NULL); printf("***SYS*** HELLO.\n");

相关文档
最新文档