problem with sockets under win32; premature connection termination
Regan Heath
regan at netmail.co.nz
Sat May 12 09:48:04 PDT 2007
Still stumped I tried C this time with the same results.
----------
#include <winsock2.h>
#include <stdio.h>
#include <stdlib.h>
#include <process.h>
#define ISEOL(c) (c == '\r' || c == '\n')
void print_error()
{
char bf[1000];
int n,i;
n = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
WSAGetLastError(),
LANG_USER_DEFAULT, //MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT),
bf,
1000,
NULL);
for(; n > 0 && ISEOL(bf[n-1]); n--) bf[n-1] = '\0';
for(i = n; i >= 0; i--)
{
if (!ISEOL(bf[i])) continue;
if (bf[i] == '\n') bf[i] = ' ';
if (bf[i] == '\r') memmove(&bf[i], &bf[i+1], n-i);
}
printf("ERROR: %s\n",bf);
}
void init()
{
WSADATA wd;
if (WSAStartup(0x2020, &wd)) {
print_error();
exit(1);
}
}
void main(int argc, char* args[])
{
SOCKET l, request;
SOCKADDR_IN sin;
unsigned long num = 0;
int size;
init();
sin.sin_addr.s_addr = inet_addr("127.0.0.1");
sin.sin_port = htons(atoi(args[1]));
sin.sin_family = AF_INET;
printf("%s:%d\n",inet_ntoa(sin.sin_addr),ntohs(sin.sin_port));
l = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
printf("%d\n",l);
printf("%d\n",ioctlsocket(l, FIONBIO, &num));
printf("%d\n",bind(l, (SOCKADDR*)&sin, sizeof(sin)));
printf("%d\n",listen(l, SOMAXCONN));
request = accept(l, NULL, NULL);
size = sizeof(sin);
getsockname(request, (SOCKADDR*)&sin, &size);
printf("%s:%d\n",inet_ntoa(sin.sin_addr),ntohs(sin.sin_port));
printf("%d\n",request);
printf("%d\n",ioctlsocket(request, FIONBIO, &num));
printf("%d\n",send(request,"TEST\r\n",6,0));
Sleep(5000);
printf("%d\n",shutdown(request, SD_BOTH));
printf("%d\n",closesocket(request));
printf("%d\n",closesocket(l));
}
-----------
Compile with:
dmc bug.c wsock32.lib
Run as:
bug 80
Telnet with:
telnet 127.0.0.1 80
Results:
127.0.0.1:80
924
0
0
0
127.0.0.1:80
916
0
6
0
0
0
Telnet window connects and closes, no data is seen.
Odd.
Regan Heath
More information about the Digitalmars-d
mailing list