swathi_k
February 5th, 2007, 10:37 AM
I has written simple client and server code ( in VC++ 6.0). In server select( , ,wfd,) is not getting activated if I use setsockopt( , , SO_SNDBUF, 0,) for windows 2000 but it is working perfectly in windows XP
Server code
#include <winsock2.h>
#include <windows.h>
#include <stddef.h>
#include <mswsock.h>
#include<stdio.h>
#pragma comment(lib,"ws2_32")
void main()
{
WSADATA wsa;
WSAStartup(MAKEWORD(2,0),&wsa);
int listenfd=0,len=0;
SOCKET acceptfd;
int i=0,nrec=0,bytes=0;
char serverbuff[1024]={0};
struct sockaddr_in serv;
len=sizeof(serv);
FD_SET wfd;
FD_ZERO(&wfd);
struct timeval tv;
tv.tv_sec = 5;
tv.tv_usec = 0;
listenfd=socket(AF_INET,SOCK_STREAM,0);
serv.sin_family=AF_INET;
serv.sin_port=htons(9393);
serv.sin_addr.s_addr=INADDR_ANY;
bind(listenfd,(struct sockaddr *)&serv,len);
listen(listenfd,5);
printf("listen fd %d\n",listenfd);
printf("wait for accept\n");
acceptfd=accept(listenfd,(struct sockaddr *)&serv,&len);
if(!acceptfd)
{
printf(" error in accept sock \n");
return ;
}
printf("SERVER accept %d \n ",acceptfd);
int one = 0;
setsockopt(acceptfd, SOL_SOCKET, SO_SNDBUF, (char *)&one, sizeof(one));
//if I remove this it is working in windows 2000 also
FD_SET(acceptfd, &wfd);
printf("Waiting for select ...\n");
int ret = select(-1, NULL, &wfd, NULL, &tv);
if(ret == 0 || ret == SOCKET_ERROR)
{
int error = WSAGetLastError(); // 10038 - WSAENOTSOCK
printf("\nselect error %d\n", error);
}
else
{
i=strlen("+OK IncoreProxy POP3 proxy\r\n");
bytes=send(acceptfd,"+OK IncoreProxy POP3 proxy\r\n",i,0);
printf(" send bytes %d \n",bytes);
}
}
Server code
#include <winsock2.h>
#include <windows.h>
#include <stddef.h>
#include <mswsock.h>
#include<stdio.h>
#pragma comment(lib,"ws2_32")
void main()
{
WSADATA wsa;
WSAStartup(MAKEWORD(2,0),&wsa);
int listenfd=0,len=0;
SOCKET acceptfd;
int i=0,nrec=0,bytes=0;
char serverbuff[1024]={0};
struct sockaddr_in serv;
len=sizeof(serv);
FD_SET wfd;
FD_ZERO(&wfd);
struct timeval tv;
tv.tv_sec = 5;
tv.tv_usec = 0;
listenfd=socket(AF_INET,SOCK_STREAM,0);
serv.sin_family=AF_INET;
serv.sin_port=htons(9393);
serv.sin_addr.s_addr=INADDR_ANY;
bind(listenfd,(struct sockaddr *)&serv,len);
listen(listenfd,5);
printf("listen fd %d\n",listenfd);
printf("wait for accept\n");
acceptfd=accept(listenfd,(struct sockaddr *)&serv,&len);
if(!acceptfd)
{
printf(" error in accept sock \n");
return ;
}
printf("SERVER accept %d \n ",acceptfd);
int one = 0;
setsockopt(acceptfd, SOL_SOCKET, SO_SNDBUF, (char *)&one, sizeof(one));
//if I remove this it is working in windows 2000 also
FD_SET(acceptfd, &wfd);
printf("Waiting for select ...\n");
int ret = select(-1, NULL, &wfd, NULL, &tv);
if(ret == 0 || ret == SOCKET_ERROR)
{
int error = WSAGetLastError(); // 10038 - WSAENOTSOCK
printf("\nselect error %d\n", error);
}
else
{
i=strlen("+OK IncoreProxy POP3 proxy\r\n");
bytes=send(acceptfd,"+OK IncoreProxy POP3 proxy\r\n",i,0);
printf(" send bytes %d \n",bytes);
}
}