snifer

(原创)基于balckfin架构下的socket通信-服务器端程序设计

0
阅读(2480)

基于balckfin架构下的socket通信-服务器端程序设计,昨晚新鲜出炉啊!!!!

我们将PC机作为服务端,balckfin作为客户端。在服务器上编写TCPServer(语言为C++),编写完毕后编译、生成可执行文件TCPServer.exe。在客户端,我们先在PC机上在ucLINUX系统下写好代码,然后通过交叉编译环境GCC交叉编译,最后将其挂载到balckfin上。

发送方的工作流程为:首先初始化Winsock库,创建套接字,绑定套接字到一个本地地址,然后进入监听模式,当接收到一个连接,经过确认后,即开始发送数据,数据发送完毕后关闭套接字。

接收方的工作流程为:在新的文件传送过程建立后,读取最先收到的数据并且保存,它是待接收文件的数据字节数;然后判断可读取的数据字节数是否已经达到文件的数据字节数,如果未达到则继续等待,直到收到全部文件数据后才读取出Winsock中的数据,进行处理。

在balckfin上我们使用Qtopia的解决方案。Qtopia 是Trolltech 公司为采用嵌入式ucLinux 操作系统的消费电子设备而开发的综合应用平台, Qtopia包含完整的应用层、灵活的用户界面、窗口操作系统、应用程序启动程序以及开发框架。

// TCPServer.cpp文件

#include "../skts/InitSock.h"

#include

#include

CInitSock initSock; // 初始化Winsock库

int main()

{

// 创建套接字

SOCKET sListen = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

if(sListen == INVALID_SOCKET)

{

printf("Failed socket() \n");

return 0;

}

// 填充sockaddr_in结构

sockaddr_in sin;

sin.sin_family = AF_INET;

sin.sin_port = htons(3490);

sin.sin_addr.S_un.S_addr = inet_addr("192.168.1.196");

// 绑定这个套接字到一个本地地址

if(::bind(sListen, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR)

{

printf("Failed bind() \n");

return 0;

}

// 进入监听模式

if(::listen(sListen, 2) == SOCKET_ERROR)

{

printf("Failed listen() \n");

return 0;

}

// 循环接受客户的连接请求

sockaddr_in remoteAddr;

int nAddrLen = sizeof(remoteAddr);

SOCKET sClient;

char szText[256] = "TCP Server Demo!";

while(TRUE)

{

// 接受一个新连接

sClient = ::accept(sListen, (SOCKADDR*)&remoteAddr, &nAddrLen);

if(sClient == INVALID_SOCKET)

{

printf("Failed accept()");

continue;

}

printf(" 接受到一个连接:%s \r\n", inet_ntoa(remoteAddr.sin_addr));

int i=0;

// 向客户端发送数据

while (TRUE)

{

scanf("%s",szText);

::send(sClient, szText, strlen(szText), 0);

printf("%d send:%s\n",++i,szText);

if (szText[0]=='q')

break;

}

// 关闭同客户端的连接

::closesocket(sClient);

// getch();

// break;

}

// 关闭监听套节字

::closesocket(sListen);

return 0;

}

一晚上反复调试,其中建立连接,交换信息是关键,一晚上的成绩 ,明天开始客户端程序的设计了,呵呵!!!

Baidu
map