首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 操作系统 > UNIXLINUX >

linux 无线网卡socket编程出错解决方案

2012-02-27 
linux 无线网卡socket编程出错大家好,小弟最近做网络编程的一些东西。主要想实现arm端和笔记本电脑端进行通

linux 无线网卡socket编程出错
大家好,小弟最近做网络编程的一些东西。主要想实现arm端和笔记本电脑端进行通讯,二者通过无线网卡来进行,通过一个公共的无线路由来连接,现在的问题是原来用有线网络可以调通的程序,换成无线网络就不行了,可以相互ping的通,不知什么原因。之前有用过另外一款网线网卡,和笔记本进行点对点连接是可以的,也就是说哦不走外网的话程序也是能行的。以下是手法两端的程序:
server:

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

#define SERVPORT 3333
#define BACKLOG 10
#define MAX_CONNECTED_NO 10
#define MAXDATASIZE 10

int main()
{
  struct sockaddr_in server_sockaddr,client_sockaddr;
  int sin_size,recvbytes;
  int sockfd,client_fd,i;
  char buf[MAXDATASIZE];
/*建立一个socket*/
  if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1){
  perror("socket error");
  exit(1);
  }
  printf("socket success!,sockfd=%d\n",sockfd);
/*设置相关参数*/
  server_sockaddr.sin_family=AF_INET;
  server_sockaddr.sin_port=htons(SERVPORT);
  server_sockaddr.sin_addr.s_addr=INADDR_ANY; //0.0.0.0
  bzero(&(server_sockaddr.sin_zero),8);
/*绑定函数bind*/
  if(bind(sockfd,(struct sockaddr *)&server_sockaddr,sizeof(struct sockaddr))==-1){ 
  perror("bind error");
  exit(1);  
  }
  printf("bind success!\n");
/*调用listen,backlog表示主机允许多少个从机与之连接进行传输*/
  if(listen(sockfd,BACKLOG)==-1){
  perror("listen error");
  exit(1);  
  }
  printf("listen...\n");
/*调用accept,等待客户端的连接*/
  sin_size=sizeof(client_sockaddr);
  if((client_fd=accept(sockfd,(struct sockaddr *)&client_sockaddr,&sin_size))==-1){
  perror("accept error"); //clientfd = accept(socketfd, (struct sockaddr *)&clientAdd, &len)) 
  exit(1);  
  }
  while(1)
  {
  if((recvbytes=recv(client_fd,buf,MAXDATASIZE,0))==-1){
  perror("recv error");
  exit(1);  
  }  

  if((buf[0]=='&')&&(buf[8]=='\n'))
  {
  for(i=1;i<MAXDATASIZE-2;i++)
  printf("%d ",buf[i]);
  printf("\n");
  //sleep(1); 
  }
  }
}




client:

/****************************************************************************  
【文 件 名 称】client.c  
【功 能 描 述】三星S3C2440A板无线网卡程序代码  
【程 序 版 本】1.0 
【创建人及创建日期】耿海飞( Grant )//2009年6月7日14:40  
****************************************************************************/ 
#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <netinet/in.h>
#include <sys/socket.h>

#include <stddef.h>

#include <unistd.h>

#include "pthread.h"

#define SERVPORT 3333 //必须和主机保持一致
#define MAXDATASIZE 10

pthread_mutex_t mutex;
char buf[MAXDATASIZE];//存放拟合系数

int sockfd,sendbytes;

void initnetwork(void)
{
  struct hostent *host;
  struct sockaddr_in serv_addr;


//解析主机地址
  if((host=gethostbyname("202.38.214.100"))==NULL){
  perror("gethostbyname error");
  exit(1);
  }
  printf("Host name:%s\n", host->h_name);
  printf("IP Address:%s\n",inet_ntoa(*((struct in_addr *)host->h_addr))); 
//建立一个socket
  if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1){


  perror("socket error");
  exit(1);
  }
//设置服务器端sockaddr_in的相关参数
  serv_addr.sin_family=AF_INET;
  serv_addr.sin_port=htons(SERVPORT);
  serv_addr.sin_addr=*((struct in_addr*)host->h_addr); 
  bzero(&(serv_addr.sin_zero),8);
//调用connect主动发起对服务器端的连接
  while(connect(sockfd,(struct sockaddr *)&serv_addr,sizeof(struct sockaddr))==-1);
}
void senddata(void)
{
  int i=0;
  while(1)

  {

  pthread_mutex_lock(&mutex);

 //发送信息给服务器
  if((sendbytes=send(sockfd,buf,sizeof(buf),0))==-1){
  perror("send error");
  exit(1);  
 }  
i+=sendbytes;
sendbytes=0;
printf("send %d bytes\n",i);

  pthread_mutex_unlock(&mutex);

  }
}
void receivedata(void)
{
  while(1)

  {

  pthread_mutex_lock(&mutex);

   

//发送信息给服务器
  if((sendbytes=recv(sockfd,buf,sizeof(buf),0))==-1){
  perror("receive error");
  exit(1);  
 }
  pthread_mutex_unlock(&mutex);

  }
}
//opencv
void opencvdata(void)
{
  int i,j;
  j=0;
  while(1)

  {

  pthread_mutex_lock(&mutex);  
  //模拟拟合系数
  for(i=1;i<8;i++)
  buf[i]=j++;  
printf("j=%d\n",j); 
  pthread_mutex_unlock(&mutex);

  }
}

main(int argc,char *argv[])
{
  pthread_t sender,receiver,opencv;
  int i;
//模拟拟合系数
  buf[0]='&';
  for(i=1;i<8;i++)
  buf[i]=i;
  buf[8]='\n';
  buf[9]=0;
//初始化网络
  initnetwork();
//初始化互斥锁并创建进程

  pthread_mutex_init(&mutex,NULL);
  pthread_create(&sender,NULL,(void*)&senddata,NULL);
  pthread_create(&opencv,NULL,(void*)&opencvdata,NULL);
//互相等待结束important
  pthread_join(sender,NULL);
  pthread_join(opencv,NULL);  
  close(sockfd);
}


还望大家多多指教,小弟先谢过了~



[解决办法]
我以前在ti的davinci平台下作过基于无线网卡的通信,

只要能ping通,说明,你的无线网络驱动和链路都没有问题,问题应该出在你的应用层的程序。
大概看了下你的程序,你是基于TCP协议的(好久没有碰了,不太确定了都),要不你改为基于UDP的试试,UDP还简单些。
[解决办法]
我以前在ti的davinci平台下作过基于无线网卡的通信,

只要能ping通,说明,你的无线网络驱动和链路都没有问题,问题应该出在你的应用层的程序。
大概看了下你的程序,你是基于TCP协议的(好久没有碰了,不太确定了都),要不你改为基于UDP的试试,UDP还简单些。
[解决办法]
我以前在ti的davinci平台下作过基于无线网卡的通信,

只要能ping通,说明,你的无线网络驱动和链路都没有问题,问题应该出在你的应用层的程序。
大概看了下你的程序,你是基于TCP协议的(好久没有碰了,不太确定了都),要不你改为基于UDP的试试,UDP还简单些。
[解决办法]
没人回帖??LZ 加劲啊。。。

热点排行