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