基于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 <stdio.h>
#include <conio.h>
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;
}
一晚上反复调试,其中建立连接,交换信息是关键,一晚上的成绩 ,明天开始客户端程序的设计了,呵呵!!!