没有人回答吗?高手都到哪去了? 惨!惨! 两条贴共200分。 无忌兄你在哪! (100分)

  • 主题发起人 主题发起人 zheng
  • 开始时间 开始时间
嗬嗬,大致看了看代码,怎么服务端没有listen??? 光bind不listen怎么接受客户端的连接呀?
 
UDP本来就不需要Listen等的吧!
 
不好意思,没注意到是SOCK_DGRAM而不是SOCK_STREAM。 算我没说好了
 
呵呵,没办法了,最后给你一个C语言的吧,反正跟pascal差不多,你改改就可以了

// Module Name: Receiver.c
#include <winsock2.h>
#include <stdio.h>
#include <stdlib.h>

#define DEFAULT_PORT 5150
#define DEFAULT_COUNT 25
#define DEFAULT_BUFFER_LENGTH 4096

int iPort = DEFAULT_PORT; // Port to receive on
DWORD dwCount = DEFAULT_COUNT, // Number of messages to read
dwLength = DEFAULT_BUFFER_LENGTH; // Length of receiving buffer
BOOL bInterface = FALSE; // Use an interface other than
// default
char szInterface[32]; // Interface to read datagrams from

//
// Function: usage:
//
// Description:
// Print usage information and exit
//
void usage()
{
printf("usage: sender [-p:int] [-i:IP][-n:x] [-b:x]/n/n");
printf(" -p:int Local port/n");
printf(" -i:IP Local IP address to listen on/n");
printf(" -n:x Number of times to send message/n");
printf(" -b:x Size of buffer to send/n/n");
ExitProcess(1);
}

//
// Function: ValidateArgs
//
// Description:
// Parse the command line arguments, and set some global flags to
// indicate what actions to perform
//
void ValidateArgs(int argc, char **argv)
{
int i;

for(i = 1; i < argc; i++)
{
if ((argv[0] == '-') || (argv[0] == '/'))
{
switch (tolower(argv[1]))
{
case 'p': // Local port
if (strlen(argv) > 3)
iPort = atoi(&argv[3]);
break;
case 'n': // Number of times to receive message
if (strlen(argv) > 3)
dwCount = atol(&argv[3]);
break;
case 'b': // Buffer size
if (strlen(argv) > 3)
dwLength = atol(&argv[3]);
break;
case 'i': // Interface to receive datagrams on
if (strlen(argv) > 3)
{
bInterface = TRUE;
strcpy(szInterface, &argv[3]);
}
break;
default:
usage();
break;
}
}
}
}

//
// Function: main
//
// Description:
// Main thread of execution. Initialize Winsock, parse the command
// line arguments, create a socket, bind it to a local interface
// and port, and then read datagrams.
//
int main(int argc, char **argv)
{
WSADATA wsd;
SOCKET s;
char *recvbuf = NULL;
int ret,
i;
DWORD dwSenderSize;
SOCKADDR_IN sender,
local;

// Parse arguments and load Winsock
//
ValidateArgs(argc, argv);

if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)
{
printf("WSAStartup failed!/n");
return 1;
}
// Create the socket and bind it to a local interface and port
//
s = socket(AF_INET, SOCK_DGRAM, 0);
if (s == INVALID_SOCKET)
{
printf("socket() failed; %d/n", WSAGetLastError());
return 1;
}
local.sin_family = AF_INET;
local.sin_port = htons((short)iPort);
if (bInterface)
local.sin_addr.s_addr = inet_addr(szInterface);
else
local.sin_addr.s_addr = htonl(INADDR_ANY);
if (bind(s, (SOCKADDR *)&local, sizeof(local)) == SOCKET_ERROR)
{
printf("bind() failed: %d/n", WSAGetLastError());
return 1;
}
// Allocate the receive buffer
//
recvbuf = GlobalAlloc(GMEM_FIXED, dwLength);
if (!recvbuf)
{
printf("GlobalAlloc() failed: %d/n", GetLastError());
return 1;
}
// Read the datagrams
//
for(i = 0; i < dwCount; i++)
{
dwSenderSize = sizeof(sender);
ret = recvfrom(s, recvbuf, dwLength, 0,
(SOCKADDR *)&sender, &dwSenderSize);
if (ret == SOCKET_ERROR)
{
printf("recvfrom() failed; %d/n", WSAGetLastError());
break;
}
else if (ret == 0)
break;
else
{
recvbuf[ret] = '/0';
printf("[%s] sent me: '%s'/n",
inet_ntoa(sender.sin_addr), recvbuf);
}
}
closesocket(s);

GlobalFree(recvbuf);
WSACleanup();
return 0;
}
 
// Module Name: Sender.c
#include <winsock2.h>
#include <stdio.h>
#include <stdlib.h>

#define DEFAULT_PORT 5150
#define DEFAULT_COUNT 25
#define DEFAULT_CHAR 'a'
#define DEFAULT_BUFFER_LENGTH 64

BOOL bConnect = FALSE; // Connect to recipient first
int iPort = DEFAULT_PORT; // Port to send data to
char cChar = DEFAULT_CHAR; // Character to fill buffer
DWORD dwCount = DEFAULT_COUNT, // Number of messages to send
dwLength = DEFAULT_BUFFER_LENGTH; // Length of buffer to send
char szRecipient[128]; // Recipient's IP or hostname

//
// Function: usage
//
// Description:
// Print usage information and exit
//
void usage()
{
printf("usage: sender [-p:int] [-r:IP] "
"[-c] [-n:x] [-b:x] [-d:c]/n/n");
printf(" -p:int Remote port/n");
printf(" -r:IP Recipients IP address or hostname/n");
printf(" -c Connect to remote IP first/n");
printf(" -n:x Number of times to send message/n");
printf(" -b:x Size of buffer to send/n");
printf(" -d:c Character to fill buffer with/n/n");
ExitProcess(1);
}

//
// Function: ValidateArgs
//
// Description:
// Parse the command line arguments, and set some global flags to
// indicate what actions to perform
//
void ValidateArgs(int argc, char **argv)
{
int i;

for(i = 1; i < argc; i++)
{
if ((argv[0] == '-') || (argv[0] == '/'))
{
switch (tolower(argv[1]))
{
case 'p': // Remote port
if (strlen(argv) > 3)
iPort = atoi(&argv[3]);
break;
case 'r': // Recipient's IP addr
if (strlen(argv) > 3)
strcpy(szRecipient, &argv[3]);
break;
case 'c': // Connect to recipients IP addr
bConnect = TRUE;
break;
case 'n': // Number of times to send message
if (strlen(argv) > 3)
dwCount = atol(&argv[3]);
break;
case 'b': // Buffer size
if (strlen(argv) > 3)
dwLength = atol(&argv[3]);
break;
case 'd': // Character to fill buffer
cChar = argv[3];
break;
default:
usage();
break;
}
}
}
}

//
// Function: main
//
// Description:
// Main thread of execution. Initialize Winsock, parse the command
// line arguments, create a socket, connect to the remote IP
// address if specified, and then send datagram messages to the
// recipient.
//
int main(int argc, char **argv)
{
WSADATA wsd;
SOCKET s;
char *sendbuf = NULL;
int ret,
i;
SOCKADDR_IN recipient;

// Parse the command line and load Winsock
//
ValidateArgs(argc, argv);

if (WSAStartup(MAKEWORD(2, 2), &wsd) != 0)
{
printf("WSAStartup failed!/n");
return 1;
}
// Create the socket
//
s = socket(AF_INET, SOCK_DGRAM, 0);
if (s == INVALID_SOCKET)
{
printf("socket() failed; %d/n", WSAGetLastError());
return 1;
}
// Resolve the recipient's IP address or hostname
//
recipient.sin_family = AF_INET;
recipient.sin_port = htons((short)iPort);
if ((recipient.sin_addr.s_addr = inet_addr(szRecipient))
== INADDR_NONE)
{
struct hostent *host=NULL;

host = gethostbyname(szRecipient);
if (host)
CopyMemory(&recipient.sin_addr, host->h_addr_list[0],
host->h_length);
else
{
printf("gethostbyname() failed: %d/n", WSAGetLastError());
WSACleanup();
return 1;
}
}
// Allocate the send buffer
//
sendbuf = GlobalAlloc(GMEM_FIXED, dwLength);
if (!sendbuf)
{
printf("GlobalAlloc() failed: %d/n", GetLastError());
return 1;
}
memset(sendbuf, cChar, dwLength);
//
// If the connect option is set, "connect" to the recipient
// and send the data with the send() function
//
if (bConnect)
{
if (connect(s, (SOCKADDR *)&recipient,
sizeof(recipient)) == SOCKET_ERROR)
{
printf("connect() failed: %d/n", WSAGetLastError());
GlobalFree(sendbuf);
WSACleanup();
return 1;
}
for(i = 0; i < dwCount; i++)
{
ret = send(s, sendbuf, dwLength, 0);
if (ret == SOCKET_ERROR)
{
printf("send() failed: %d/n", WSAGetLastError());
break;
}
else if (ret == 0)
break;
// send() succeeded!
}
}
else
{
// Otherwise, use the sendto() function
//
for(i = 0; i < dwCount; i++)
{
ret = sendto(s, sendbuf, dwLength, 0,
(SOCKADDR *)&recipient, sizeof(recipient));
if (ret == SOCKET_ERROR)
{
printf("sendto() failed; %d/n", WSAGetLastError());
break;
}
else if (ret == 0)
break;
// sendto() succeeded!
}
}
closesocket(s);

GlobalFree(sendbuf);
WSACleanup();
return 0;
}
 
ego:
好人!
试过你的“MainServer”代码,老是到了“WSAWaitForMultipleEvents(EventTotal, @Events, False, WSA_INFINITE, False);”这句就停下来,象是在等待什么事件,
但我用客户端连接又没有反应,你能给我讲一讲这个函数的原理吗。另外,我没有用TFrom,结果线程运行一下就退出了,整个程序就退出,而如果使用From他就会不断
循环执行,有什么方法能达到既不用Form,又用线程来做。
 
没有必要这样吧。太多了,最好在网上放个源码下载的链接!
 
后退
顶部