鸿 网 互 联 www.68idc.cn

Linux下C网络编程(socket)

来源:互联网 作者:佚名 时间:2015-06-03 08:51
经本人在NETTERM客户端测试 没发现什么问题 不过可能还有好多不合理的地方 希望各位大虾指正! 由于在我的博客上已经转载了几篇关于Linux下socket编程 所以此处只对头文件做简单介绍 头文件介绍 errno h 返回错误信息 用的是perro() 所以头文件有errno h netd

  经本人在NETTERM客户端测试没发现什么问题不过可能还有好多不合理的地方希望各位大虾指正!

  由于在我的博客上已经转载了几篇关于Linux下socket编程所以此处只对头文件做简单介绍

  头文件介绍

  errnoh

  返回错误信息用的是perro()所以头文件有errnoh

  netdbh

  定义struct hostent *gethostbyname(const char *hostname)要用的头文件

  #include
#include
#include

  可能是网络编程用套节字必须的吧!

  这是客户端程序从服务器接受数据别写入文件中

  QUOTE:
#include
#include
#include
#include
#include
#include
#include
#include
#define SERVPORT
#define MAXDATASIZE

  int main(int argc char *argv[])
{
int sockfd recvbytes;
char buf[MAXDATASIZE];
FILE *fp;
struct hostent *host;
struct sockaddr_in serv_addr;
if( argc < )
{
fprintf(stderr Please enter the servers hostname!\n);
exit();
}

  if((host=gethostbyname(argv[]))==NULL)
{
herror(gethostbyname出错!);
exit();
}

  if ((sockfd = socket(AF_INET SOCK_STREAM )) == )
{
perror(socket创建出错!);
exit();
}

  serv_addrsin_family=AF_INET;
serv_addrsin_port=htons(SERVPORT);
serv_addrsin_addr = *(struct in_addr*)host>h_addr;
bzero(&(serv_addrsin_zero));

  if (connect(sockfd (struct sockaddr *)&serv_addr
sizeof(struct sockaddr)) == )
{
perror(connect出错!);
exit();
}

  if ((fp = fopen(output_file w)) == NULL)
{
printf (cant open file);
exit();
}

  while ()
{
memset(buf );
recvbytes=recv(sockfd buf );

  if (recvbytes == )
{
printf(数据已经接收完!);
close(fp);
close(sockfd);
exit();
}

  printf(%s buf);
fprintf(fp %s buf);
}

  close (fp);
close(sockfd);

  return ;
}

  
服务器从文件读入数据到缓冲区再发送给客户端

  QUOTE:
#include
#include
#include
#include
#include
#include
#include
#include
#define SERVPORT
#define BACKLOG
#define MAXDATASIZE

  int main()
{
int sockfdclient_fd;
char buff[MAXDATASIZE];
FILE *fp;
struct sockaddr_in my_addr;
struct sockaddr_in remote_addr;
socklen_t sin_size = sizeof(struct sockaddr_in);
if ((sockfd = socket(AF_INET SOCK_STREAM )) == )
{
perror(socket创建出错!);
exit();
}

  my_addrsin_family=AF_INET;
my_addrsin_port=htons(SERVPORT);
my_addrsin_addrs_addr = inet_addr();
bzero(&(my_addrsin_zero));

  if (bind(sockfd (struct sockaddr *)&my_addr sizeof(struct sockaddr))
== )
{
perror(bind出错!);
exit();
}

  if (listen(sockfd BACKLOG) == )
{
perror(listen出错!);
exit();
}
printf(server is running\n);

  if ((client_fd = accept(sockfd (struct sockaddr *)&remote_addr
&sin_size)) == )
{
perror(accept出错);
exit();
}
else
{
printf(客户端已经连上\n);
}

  printf(开始发送数据\n);

  if ((fp = fopen(input_file r)) == NULL)
{
printf (cant open file);
exit ();
}

  while (!feof(fp))
{
if (fgets(buff fp) == NULL)
{
close(client_fd);
close(sockfd);
printf(发送完毕退出!\n);
exit();
}

  if (send(client_fd buff ) == )
{
perror(send出错!);
close(client_fd);
exit();
}

  printf (send buff = %s buff);
}

  close(fp);
close(client_fd);
close(sockfd);

  return ;
}

  
这个是input_file中的信息

  QUOTE:
name:xiaoxia sex:male age:
name:xiaoxiao sex:male age:
name:x sex:male age:
name:xi sex:male age:
name:xia sex:male age:
name:xiao sex:male age:
name:xiaox sex:male age:
~

  大家有兴趣的话可以拷贝程序试验需要两个屏幕操作结果所得到的文件output_file和input_file信息格式一样

网友评论
<