Забиндиться на TCP порт в мастдае (VC 6.0)

Filan

Вот кусок кода который прекрасно работает на FreeBSD/Linux:
int main
{
extern int net_socket;
int j, optval = 1, tempsock;
struct sockaddr_in myaddr, remoteaddr, remoteaddr_temp;
int sockaddr_len = sizeof(struct sockaddr_in);
int telnetport = 27500;
if bindsock = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP < 0)
Sys_Error ("Can't open telnet socket\n");
#ifndef __linux__
if (setsockopt (bindsock, SOL_SOCKET, SO_REUSEPORT, &optval, sizeof(optval
Sys_Error ("Can't set SO_REUSEPORT\n");
myaddr.sin_len = sockaddr_len;
#endif
if (setsockopt (bindsock, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval
Sys_Error ("Can't set SO_REUSEADDR\n");
if (fcntl (bindsock, F_SETFL, O_NONBLOCK) < 0)
Sys_Error ("Can't set O_NONBLOCK\n");
myaddr.sin_family = PF_INET;
myaddr.sin_port = htonl (telnetport);
myaddr.sin_addr.s_addr = htonl (/*INADDR_LOOPBACK*/INADDR_ANY);
if (bind (bindsock, (struct sockaddr *)&myaddr, sockaddr_len
{
printf ("%s\n", strerror (errno;
Sys_Error ("Can't bind telnet socket");
}
if (listen (bindsock, 1
Sys_Error ("Can't listen telnet socket");
j = max(net_socket, bindsock);
while (1)
{
.......
}
}
Для мастдая сделал небольшие изменения:
int main
{
extern int net_serversocket;
int j, optval = 1, tempsock;
struct sockaddr_in myaddr, remoteaddr, remoteaddr_temp;
int sockaddr_len = sizeof(struct sockaddr_in);
int telnetport = 27500;
if bindsock = socket (PF_INET, SOCK_STREAM, IPPROTO_TCP < 0)
Sys_Error ("Can't open telnet socket: %s", strerror(errno;
// if (setsockopt (bindsock, SOL_SOCKET, SO_REUSEPORT, (char*)&optval, sizeof(optval
// Sys_Error ("Can't set SO_REUSEPORT\n");
// myaddr.sin_len = sockaddr_len;
if (setsockopt (bindsock, SOL_SOCKET, SO_REUSEADDR, (char*)&optval, sizeof(optval
Sys_Error ("Can't set SO_REUSEADDR: %s", strerror(errno;
// if (fcntl (bindsock, F_SETFL, O_NONBLOCK) < 0)
// Sys_Error ("Can't set O_NONBLOCK\n");
if (ioctlsocket (bindsock, FIONBIO, &optval
Sys_Error ("Can't set FIONBIO: %s", strerror(errno;
myaddr.sin_family = AF_INET;
myaddr.sin_port = htonl (telnetport);
myaddr.sin_addr.s_addr = htonl (/*INADDR_LOOPBACK*/INADDR_ANY);
if (bind (bindsock, (struct sockaddr *)&myaddr, sockaddr_len
{
// printf ("%s\n", strerror (errno;
Sys_Error ("Can't bind telnet socket: %s", strerror(errno;
}
if (listen (bindsock, 1
Sys_Error ("Can't listen telnet socket: %s", strerror(errno;
j = max(net_serversocket, bindsock);
while(1)
{
.......
}
}
В юнихах видно по netstat, что на порт кто-то забиндился, а в мастдае это не происходит.
Что ещё надо подкрутить? (Перспектива читать килограммы MSDN как-то не очень прельщает... )

CapitanJack

по нему поиск есть. и помницца там был tcp sample

jupol

используй теги code , kz

otets-mihail

замени htonl на htons

Landstreicher

может и не в тему, но у меня в свое время точно так же прога не работала, потому что я не вызывал какую-то бодягу под названием WSAStartup - ни одна сетевая функция не будет работать пока ее не вызовешь. хелп есть тут: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winsock/winsock/wsastartup_2.asp
The WSAStartup function must be the first Windows Sockets function called by an application or DLL

Aleksei66

Кроме того в Виндах свои, самостийные сокеты. Чтобы узнать, что там так, а что иначе, нужно MSDN читать.

kokoc88



#include <Winsock2.h>
int main(int argc, char* argv[])
{
WSADATA wsaData;
WORD wVersionRequested = MAKEWORD(2, 2);
WSAStartup(wVersionRequested, &wsaData);
int s = socket(AF_INET, SOCK_STREAM, 0);
int opt = 1;
setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (char *) &opt, sizeof(opt;
sockaddr_in sa;
sa.sin_family = AF_INET;
sa.sin_port = htonsu_short)27500);
sa.sin_addr.s_addr = INADDR_ANY;
if (bind(s, (struct sockaddr *) &sa, sizeof(sa < 0)
{
perror("Init socket: bind");
closesocket(s);
return -1;
}
if (listen(s, 3) < 0)
{
perror("Init socket: listen");
closesocket(s);
return -2;
}
while (1)
{
}
return 0;
}


netstat -a
...
TCP michael:27500 michael:0 LISTENING
...

Filan

> замени htonl на htons
И так работает, хотя поменять надо - это как-то правильней.

Filan

Всем огромное спасибо.
Можно закрывать тему.
Оставить комментарий
Имя или ник:
Комментарий: