近来一直忙着工作上的代码,不难,就是很烦。写习惯了C++,再写C时,总觉得东一块西一块的,代码写的零零散散。于是将文件作为namespace,前缀作为class,总算能看明白了。。。。
写好,编译时才发现没有其他同事的代码支持,就算编译过了也没法‘运行’自己的代码,于是开始剥离代码,一点点的抛开自己用不到代码,终于可以用一个main(),可以跑起来了,却又发现自己根本不会在目标机上调试,习惯了VCExpresss下的breakpoint后,去用printf(),那是没法接受的。于是又准备将用到的library进行‘portable’处理,发现不可能。。。那些都是不能cross-platform的API,挣扎了很久,终于决定在windows上模拟实现用到的library,就是自己在windows上实现目标机上的library,如sharedmemory等。
终于这一切都搞定了,widnows下编译,链接,测试,好不痛快,虽然消耗了大量‘无用代码’的时间,还好,我指法比较好,嘿嘿~
但自己的代码总要合成到系统中去的,在系统调试时,我一样会变得无从下手的,于是又了现在的‘狠招’--添加一个‘telnet’到代码中。。。。
哇哈哈。。。有了telnet,一切尽在掌握在了~但,但,但。。。。才发现,自己不会写socket了。。。丢脸,唉,被ACE惯坏了~
说了一堆废话,正题来了,下面的代码是练习windows下的socket之作,很乱,没有头绪的,仅作代码保留用~。
int CC_Telnet_Create(const char* ip, unsigned short port)
{
int i = -1;
BOOL flag = 1;
SOCKET ls = 0;
SOCKET as = 0;
SOCKET cs[5];
int count = 0;
WSADATA wsa;
struct sockaddr_in addr;
struct timeval val;
fd_set rd, wd;
int ret = -1;
ret = WSAStartup(MAKEWORD(2, 2), &wsa);
if(ret != NO_ERROR)
{
printf("WSAStartup() failed.\n");
return -1;
}
ls = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(ls == INVALID_SOCKET)
{
WSACleanup();
printf("socket() failed.\n");
return -1;
}
if(ioctlsocket(ls, FIONBIO, &flag) != 0)
{
WSACleanup();
printf("socket() failed.\n");
return -1;
}
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr(ip);
addr.sin_port = htons(port);
if(bind(ls, (const struct sockaddr*)&addr, sizeof(addr)) != 0)
{
WSACleanup();
printf("bind() failed.\n");
return -1;
}
if(listen(ls, SOMAXCONN) != 0)
{
WSACleanup();
printf("listen() failed.\n");
return -1;
}
val.tv_sec = 0;
val.tv_usec = 100;
while(1)
{
FD_ZERO(&rd);
FD_ZERO(&wd);
FD_SET(ls, &rd);
FD_SET(ls, &wd);
for(i = 0; i < count; ++ i)
{
FD_SET(cs[i], &rd);
// FD_SET(cs[1], &wd);
}
ret = select(0, &rd, &wd, NULL, NULL);
if(ret > 0)// SOCKET_ERROR)
{
for(i = 0; i < count; ++ i)
{
if(FD_ISSET(cs[i], &rd) != 0)
{
printf("cs = %d in rd.\n", cs[i]);
}
if(FD_ISSET(cs[i], &wd) != 0)
{
printf("\ncs = %d in wd.\n", cs[i]);
}
}
if(FD_ISSET(ls, &rd) != 0)
{
as = accept(ls, NULL, NULL);
if(as == INVALID_SOCKET)
{
WSACleanup();
printf("accept() failed.\n");
return -1;
}
cs[count ++ ] = as;
printf("accept - %d\n", as);
}
if(FD_ISSET(ls, &wd) != 0)
{
printf("wd\n");
}
}
else
{
printf("erron = %d\n", WSAGetLastError());
break;
}
}
// close all socket, include listen socket
closesocket(ls);
WSACleanup();
return 0;
} 还好,虽然API不一样,但流程或者叫做顺序和BSD的一样,写起来除了需要msdn查看使用方法外,倒也不是很费劲。。。