Забиндиться на TCP порт в мастдае (VC 6.0)
по нему поиск есть. и помницца там был tcp sample 

используй теги code , kz
замени htonl на htons
может и не в тему, но у меня в свое время точно так же прога не работала, потому что я не вызывал какую-то бодягу под названием 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
The WSAStartup function must be the first Windows Sockets function called by an application or DLL
Кроме того в Виндах свои, самостийные сокеты. Чтобы узнать, что там так, а что иначе, нужно MSDN читать.
#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
...
> замени htonl на htons
И так работает, хотя поменять надо - это как-то правильней.
И так работает, хотя поменять надо - это как-то правильней.
Всем огромное спасибо.
Можно закрывать тему.
Можно закрывать тему.
Оставить комментарий
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 как-то не очень прельщает...