急!!!!一个Linux下网络编程问题。

angeldai 2003-11-20 06:13:25
我在LINUX下用C语言编写了一个TCP/IP网络服务器程序,用于通过以太网发送数据。
在win2000下用VC编写了一个TCP/IP网络客户端程序,用于通过以太网接收数据。

实验:
在PC104上安装LINUX,在台式电脑上安装win2000,这两台机器通过网线点对点连接,通过以上编写的程序开始传输数据。

现象:
一开始还能正常工作,但是在传了一段时间(比如传了10M或30M或更多数据)后,两台机器就开始堵塞,一般会堵塞5~10秒后就又正常了,然后又隔一段时间(与上一次隔的时间不一定一样)后又发生类似的现象,......,以上现象重复多次后,两台机器就会发生一直堵塞而再也不恢复的现象。

不知道这是什么原因造成的,有没有解决办法,让两台机器之间能够永远正常的传输数据而不发生堵塞现象?急!!!!!
...全文
124 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
YLSK 2003-12-16
  • 打赏
  • 举报
回复
为什么我对那段linux代码进行编译时,出现下面的错误呢?
# gcc commu.c
commu.c:21: parse error before `data_sock'
commu.c:21: warning: excess elements in scalar initializer
commu.c:21: warning: (near initialization for `data_sock')
commu.c:21: `data_handler' undeclared here (not in a function)
commu.c:21: warning: excess elements in scalar initializer
commu.c:21: warning: (near initialization for `data_sock')
commu.c:21: warning: data definition has no type or storage class
commu.c: In function `main':
commu.c:28: `das_thread' undeclared (first use in this function)
commu.c:28: (Each undeclared identifier is reported only once
commu.c:28: for each function it appears in.)
commu.c: At top level:
commu.c:138: `das_thread' used prior to declaration
#
cvsuser 2003-12-15
  • 打赏
  • 举报
回复
mark
onlyf 2003-12-15
  • 打赏
  • 举报
回复
学习
RomanticProgrammer 2003-12-15
  • 打赏
  • 举报
回复
学习。
liujianhui 2003-12-15
  • 打赏
  • 举报
回复
学习
angeldai 2003-12-15
  • 打赏
  • 举报
回复
这样只能改变发送缓冲区,而现在可能是接收缓冲区(WIN2000下)溢出。
有解决办法吗???急!!
angeldai 2003-12-02
  • 打赏
  • 举报
回复
to zhwh(韩信) ,
有什么办法解决吗?
t0mychen 2003-12-02
  • 打赏
  • 举报
回复
/proc/sys/net/core/rmem_max
里面的值改一下,试试
zhwh 2003-12-01
  • 打赏
  • 举报
回复
如果接收插口缓存已满,会告知接收窗口为0,那么发送端tcp中的持续定时器tcp_setpersist()会启动发送窗口探测报文,执行范围是(5,60)秒,每次时间呈指数递增.
魔芋 2003-12-01
  • 打赏
  • 举报
回复
单步跟中
angeldai 2003-12-01
  • 打赏
  • 举报
回复
代码如下:

//WIN2000,客户端数据接收程序,非堵塞接收

#define DEST_IP_ADDR "10.10.2.2"
SOCKET datasock=SOCKET_ERROR; //收工作数据,在辅助线程中
int connect_flag_data=SOCKET_ERROR; //工作数据SOCKET连接标识
WSADATA wsaData;

Main()
{
init_net(5350);
ThreadCreate();
//other codes

}

//创建工作数据接收线程
int ThreadCreate(void)
{

int status;
hRecvThread=CreateThread(NULL,
0,
(LPTHREAD_START_ROUTINE)RecvData,
NULL,//(LPVOID)ns,
0,
&dwRecvThreadID);

if (hRecvThread==NULL)
{
errorInfoFlag =FDSA_ERR_CONNECT;
status=closesocket(datasock);
if (status == SOCKET_ERROR)
{
errorInfoFlag =FDSA_ERR_CONNECT;
}
return 0;

}
return 1;
}

//网络连接初始化函数
int Init_net(u_short port)
{

struct sockaddr_in from;
unsigned long ipValue=0;
WSAStartup(MAKEWORD(2,2),&wsaData);
if(datasock==SOCKET_ERROR)
{
//for FDSADATA
datasock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
}
ipValue=inet_addr(DEST_IP_ADDR);
from.sin_family=AF_INET;
from.sin_addr.S_un.S_addr=ipValue;
from.sin_port=htons(port);
if(connect_flag_data==SOCKET_ERROR)
{
connect_flag_data= connect(datasock,(struct sockaddr FAR *)&from,sizeof(from));

}

return 1;

}


接收数据线程:
void RecvData(void)
{
int numrcv;
int msglen;
while(1)
{
msglen=2080;
Sleep(10);
numrcv=recv(datasock,databuf,msglen,0);
if(numrcv<=msglen && numrcv!=SOCKET_ERROR)
{
//code for data procession
}
else
{
//code for data procession
}
if ((numrcv == 0) || (numrcv == SOCKET_ERROR))
{
WSAGetLastError();
errorInfoFlag =FDSA_ERR_CONNECT;
//AfxMessageBox("Connection terminated!",MB_OK);
break;
}
}
}

//LINUX,服务器端数据发送程序

#include <sys/socket.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/time.h>
#include <netinet/in.h>
#include <time.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <pthread.h>
#include <stdlib.h>


//主函数
#define DATA_PORT ( 5351 ) /*sent from the system to any connected clients on TCP port 5351*/

#define DATA_QSIZE ( 5 )

static sockinfo_t data_sock = { DATA_PORT, DATA_QSIZE, data_handler };

int main(int argc, char **argv)
{
pthread_t id_data,id_das;

/* create non-socket threads */
if ( pthread_create(&id_das, NULL, das_thread, NULL) != 0 )
error("pthread_create");

/* create socket threads */
if ( create_socket_thread( &data_sock, &id_data ) != 0 )
error("create_socket_thread");

for ( ;; )
{
sleep(1);
if ( sched_yield() == -1 )
error("sched_yield");
}

return ( 0 );
}


//网络线程
typedef struct _sockinfo_t {
int port;
int queue_size;
int (*socket_handler)(int fd);
} sockinfo_t;


static void *socket_thread( void *arg )
{
sockinfo_t *sockinfo = (sockinfo_t *)arg;
int listenfd, connfd;
int optval, status;

struct sockaddr_in serv_addr, cli_addr;
socklen_t len;

pthread_detach(pthread_self());

memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
serv_addr.sin_port = htons(sockinfo->port);

if ( (listenfd = socket(PF_INET, SOCK_STREAM, 0)) == -1 )
error("socket");

optval = 1;
if ( setsockopt( listenfd, SOL_SOCKET, SO_REUSEADDR, &optval,
(socklen_t)sizeof(optval) ) == -1 )
error("setsockopt");
if ( bind(listenfd, (struct sockaddr *)&serv_addr,
(socklen_t)sizeof(serv_addr)) == -1 )
error("bind");
if ( listen(listenfd, sockinfo->queue_size) == -1 )
error("listen");

for ( ;; )
{
if ( (connfd = accept(listenfd, (struct sockaddr *)&cli_addr,
&len)) == -1 )
{
error("accept");
continue;
}
if ( (status = sockinfo->socket_handler(connfd) ))
{
error("socket_handler");
continue;
}
}

if ( close(listenfd) == -1 )
error("close");

return NULL;
}

int create_socket_thread( sockinfo_t *si, pthread_t *pt )
{
int status;

if ( (status = pthread_create(pt, NULL, socket_thread, si)) != 0 )
error("pthread_create");

return status;
}


//数据线程
#define DATABUF_SIZE 1024*2

char das_data[DATABUF_SIZE];


static struct _data_clients {
pthread_cond_t signal;
pthread_mutex_t mutex;
int start;
} data_clients = { PTHREAD_COND_INITIALIZER, PTHREAD_MUTEX_INITIALIZER,0 };


static struct _client_flag {
pthread_mutex_t mutex;
int count;
int total;
} client_flag = { PTHREAD_MUTEX_INITIALIZER, 0, 0 };


static int sockfd;
void *das_thread( void *arg ) //das线程
{
pthread_detach(pthread_self());
for ( ;; )
{
pthread_mutex_lock( &data_clients.mutex );
while ( data_clients.start == 0 ) //等待开始命令
{
if ( pthread_cond_wait( &data_clients.signal, &data_clients.mutex ) != 0 )
error("pthread_cond_wait");
}
pthread_mutex_unlock( &data_clients.mutex );

//获取AD数据,放das_data[DATABUF_SIZE]中的代码

pthread_mutex_lock( &client_flag.mutex );
if(client_flag.total)
{
if ( send(sockfd, (char *)das_data, DATABUF_SIZE, 0) == -1 )
{
error("send");
client_flag.total = 0;
}
}
pthread_mutex_unlock( &client_flag.mutex );
}

if ( close(sockfd) == -1 )
error("close");

return ( NULL );
}

int data_handler( int fd )
{

pthread_mutex_lock( &client_flag.mutex );
client_flag.total = 1;
sockfd = fd;
pthread_mutex_unlock( &client_flag.mutex );
return 0;

}
haothinking 2003-11-22
  • 打赏
  • 举报
回复
是呀!
看看代码把
Laymond 2003-11-21
  • 打赏
  • 举报
回复
我需要代码。
tison 2003-11-21
  • 打赏
  • 举报
回复
把程序传上来看看了!呵呵
rexp 2003-11-21
  • 打赏
  • 举报
回复
把情况说清楚一点,才好帮你解决问题阿。
yudang 2003-11-21
  • 打赏
  • 举报
回复
应该说要看具体的程序才有可能判断出问题所在。
fierygnu 2003-11-21
  • 打赏
  • 举报
回复
让大家猜比较难。
joknan 2003-11-21
  • 打赏
  • 举报
回复
up
ruantidongwu 2003-11-21
  • 打赏
  • 举报
回复
mark

23,110

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧