项目:根据红外线通信协议,编写一个server程序放到笔记本上,一个client程序放到PDA上,进行通信;服务器端程序如下:(控制台程序)
#include "stdafx.h"
#include <Winsock2.h>
#include <af_irda.h>#include <stdio.h>#define IAS_SET_ATTRIB_MAX_LEN 32
int main(int argc, char* argv[])
{
SOCKADDR_IRDA  server_addr = { AF_IRDA,1,0,1,1,"IrDA:IrMC"};
SOCKET sockid;
SOCKET msgsocket;//connected socket
char buffer[1024];//accept or send buffer
int rval;//accept parameter //socket version
WORD wVersionRequested;
WSADATA wsaData;
int err; //set socket version
wVersionRequested = MAKEWORD(2,2); //start socket
err = WSAStartup(wVersionRequested,&wsaData);
if(err != 0)
{
perror("there is no DLL to use");
return 1;
}

//ensure windows socket  DLL support 1.1
if((LOBYTE(wsaData.wVersion) != 2) || (HIBYTE(wsaData.wVersion) != 2))
{
perror("there is not right DLL");
WSACleanup();
return 1;
} sockid = socket(AF_IRDA,SOCK_STREAM,0);//socket number
//set up socket
while(sockid == INVALID_SOCKET)
{
int error = WSAGetLastError();
printf("set up socket failed ! error code is %d\n",error);
Sleep(500);
sockid = socket(AF_IRDA,SOCK_STREAM,0);//socket number
} if(bind(sockid,(sockaddr*)&server_addr,sizeof(server_addr)) <0)
{
int error = WSAGetLastError();
printf("there is error in binding sockets ! error code is %d\n",error);
Sleep(500);

} int length = sizeof(server_addr); listen(sockid,5);
printf("Wait for connecting ...\n");
//accept custom request and set a new socket to process custom request
msgsocket = accept(sockid,(struct sockaddr*)&server_addr,&length);

// msgsocket = accept(sockid,0,0);
if(msgsocket == INVALID_SOCKET)
{
perror("there is error in open new sockets");

}
do
{
printf("build connect successfully\n");

memset(buffer,0,sizeof(buffer));
rval = recv(msgsocket,buffer,1024,0);
//
if(rval < 0)
{
perror("there is error in recving");
break;
}
//accept complet
if(rval == 0)
{
printf("ending connect .........................");
return 1;
}
else
printf("-->%s\n",buffer);
}while(rval != 0); closesocket(msgsocket); //close listen socket
closesocket(sockid);
WSACleanup();

printf("Hello World!\n");
Sleep(10000);
return 0;
}客户端程序如下:(通过一个按钮来实现的)
void CClient200Dlg::OnSend() 
{
int sockid = 0;//socket number
SOCKADDR_IRDA server_addr = {AF_IRDA,1,0,1,1,"IrDA:IrMC"};
// struct hostent *hp;//the host info
WORD wVersionRequested;//version number
WSADATA wsaData;//the connection parameter
char *buffer = "very beautiful!";
int nLen = sizeof(buffer); //version number 2.2
wVersionRequested = MAKEWORD(2,2); //start socket
DWORD err = WSAStartup(wVersionRequested,&wsaData);
if(err != 0)
{
AfxMessageBox(_T("no DLL."));
// perror("there is no DLL to use");
} //ensure windows sockets dll support 1.1
if((LOBYTE(wsaData.wVersion)!= 2) || (HIBYTE(wsaData.wVersion)!=2))
{
AfxMessageBox(_T("111"));
WSACleanup();
} sockid = socket(AF_IRDA,SOCK_STREAM,0);
if(sockid == INVALID_SOCKET)
{    
AfxMessageBox(_T("error1."));

} //connecting
if(connect(sockid,(struct sockaddr*)&server_addr,sizeof(SOCKADDR_IRDA)) < 0)
{
CString strMessage = "error:";
CString str = "";
int error = WSAGetLastError();
str.Format(_T("%d"),error);
strMessage += str;
AfxMessageBox(strMessage); 
}
send(sockid, buffer, nLen, MSG_OOB);
closesocket(sockid);
}出现错误如下:
当服务器运行到Wait for connecting...时
客户机开始运行,但一按按钮,就会出现错误10049:无法分配请求的地址,通常是由于试图绑定一个对于本地机器来说无效的地址而引起的,当远程机器的地址或端口无效时(如地址或端口为0),调用connect ,sendto会导致该错误发生.
有时也会出现错误10036:操作正在进行.阻塞操作正在执行,WINDOWS SOCKETS只允许(每个任务或线程有)一个阻塞操作处于未完成状态,如果这是调用了其他的函数(不管它引用的是该套接字还是任何其他套接字),则函数失败,返回该错误