QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 861|回复: 10

一c语言编程问题

[复制链接]
发表于 2003-4-21 08:31:30 | 显示全部楼层 |阅读模式
在linux下用socket编程,采用udp协议编程传送文件,
具体的:
用两个进程,一个进程1负责从客户端接受指令,接收到指令后通过消息队列传送到
另一个进程2,另一个进程2负责对指令进行解释,然后通过swith函数,根据不同指令传送比较大的文件到进程1,然后由进程1送到客户端。


请各位帮我一下
提点建议或者给一点相关的源代码作参考,感激不尽。
发表于 2003-4-21 10:47:28 | 显示全部楼层
u home work? hehe
回复

使用道具 举报

 楼主| 发表于 2003-4-21 11:06:37 | 显示全部楼层
什么意思
》?
回复

使用道具 举报

 楼主| 发表于 2003-4-21 11:11:29 | 显示全部楼层
因为我初学,不知道该怎么做。请大虾给点建议
回复

使用道具 举报

发表于 2003-4-21 12:47:04 | 显示全部楼层
我的想法:不用做什么消息队列(不要搞windows那一套)
进程一:接受 分析命令或是数据 命令则处理 较大的数据 (内存拷贝)发给数据队列 队列满则需要等待进程二
进程二:专心处理数据
不过你的提问的最大的问题在于我们不知道你要实现什么?
回复

使用道具 举报

发表于 2003-4-22 20:29:43 | 显示全部楼层
u home work? hehe

呵呵
其实我不了解linux,之所以来这,是因为这里的人非常非常的好!!!
cheungming告诉他吧!知道你会
回复

使用道具 举报

发表于 2003-4-22 22:09:12 | 显示全部楼层
why use udp? can u use tcp? udp has much extra work to be done, a little more pain.
回复

使用道具 举报

发表于 2003-4-23 18:06:00 | 显示全部楼层
[quote:e8e78def20="wsm"]
进程一:接受 分析命令或是数据 命令则处理 较大的数据 (内存拷贝)发给数据队列 队列满则需要等待进程二
进程二:专心处理数据
不过你的提问的最大的问题在于我们不知道你要实现什么?[/quote]
u just intro the ftp mode
回复

使用道具 举报

发表于 2003-4-23 21:58:45 | 显示全部楼层
no, ftp use tcp. although the working mode is similar.
qin, if u can find APUE (Advanced programming in Unix environment) or Internet working with  TCP/IP. either book can tell u how to do it.
回复

使用道具 举报

发表于 2003-5-1 11:50:01 | 显示全部楼层
I just did one similar problem. hehe
I used TCP.
I remember UDP is for connectionless server & client.
There are some reference codes for UDP.
[code:1]
/*
*      Program 10.10 - SERVER - Internet Domain - connectionless
*/
#include "local.h"
main( void ) {
  int                sock, n,
                     server_len, client_len;
  struct sockaddr_in server,                            /* Address structures */
                     client;
                                                        /* create the SOCKET  */
  if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
    perror("SERVER socket ");
    exit(1);
  }                                                    /* set svr adr info   */
  server.sin_family      = AF_INET;                    /* Address family     */
  server.sin_addr.s_addr = htonl(INADDR_ANY);          /* use any address    */
  server.sin_port        = htons(0);                   /* pick a free port   */
                                                       /* BIND the socket    */
  if (bind(sock, (struct sockaddr *) &server, sizeof(server) ) < 0) {
    perror("SERVER bind "); exit(2);
  }                                                    /* obtain chosen adr  */
  if (getsockname(sock, (struct sockaddr *) &server, &server_len) < 0) {
    perror("SERVER getsocketname "); exit(3);
  }                                                    /* display port #     */
  printf("Server using port %d\n", ntohs(server.sin_port));
  while ( 1 ) {
    client_len = sizeof(client);                       /* estimate length    */
    memset(buf, 0, BUFSIZ);                            /* clear the buffer   */
    if ((n=recvfrom(sock, buf, BUFSIZ, 0,              /* the clnt message   */
        (struct sockaddr *) &client, &client_len)) < 0){
     perror("SERVER recvfrom ");
     close(sock); exit(4);
    }
    write(fileno(stdout), buf, n);                    /* show msg to server */
    memset(buf, 0, BUFSIZ);                           /* clear the buffer   */
    if (fgets(buf, BUFSIZ, stdin) != NULL ){          /* get server's msg   */
      if ((sendto(sock, buf, strlen(buf) ,0,          /* send it to client  */
        (struct sockaddr *) &client, client_len)) <0){
        perror("SERVER sendto ");
        close(sock); exit(5);
      }
    }
  }
}
[/code:1]
and
[code:1]
/* Program 10.11 - CLIENT - Internet Domain - connectionless */
#include "local.h"
main(int argc, char *argv[]){
  int             sock, n,
                  server_len;
  static struct sockaddr_in                            /* Address structures */
                  server,
                  client;
  struct hostent *host;                                 /* For host info      */
  if ( argc < 3 ) {                                     /* need server & port */
    fprintf(stderr, "usage: %s server port_#\n", argv[0]);
    exit(1);
  }
  if (!(host=gethostbyname(argv[1]))){                  /* get server info    */
    perror("CLIENT gethostname ");      exit(2);
  }                                                     /* set svr adr info   */
  server.sin_family = AF_INET;                          /* address family     */
  memcpy(&server.sin_addr, host->h_addr, host->h_length);         /* act adr  */
  server.sin_port   = htons(atoi(argv[2]));             /* @ passed in port # */
                                                        /* create a SOCKET    */
  if ((sock=socket(AF_INET, SOCK_DGRAM, 0)) < 0 ) {
    perror("CLIENT socket "); exit(3);
  }                                                     /* set clnt adr info  */
  client.sin_family      = AF_INET;                     /* address family     */
  client.sin_addr.s_addr = htonl(INADDR_ANY);           /* use any address    */
  client.sin_port        = htons( 0 );                  /* pick a free port   */
                                                        /* BIND the socket    */
  if (bind(sock, (struct sockaddr *) &client, sizeof(client)) < 0) {
    perror("CLIENT bind "); exit(4);
  }
  while( fgets(buf, BUFSIZ, stdin) != NULL ){           /* get clnt's msg     */
    server_len=sizeof(server);                          /* guess at length    */
    if (sendto( sock, buf, strlen(buf), 0,              /* send msg to server */
     (struct sockaddr *) &server, server_len) < 0 ){
       perror("CLIENT sendto ");
       close(sock); exit(5);
    }
    memset(buf,0,BUFSIZ);                               /* clear the buffer   */
    if ((n=recvfrom(sock, buf, BUFSIZ, 0,               /* server's message   */
        (struct sockaddr *) &server, &server_len)) < 0){
      perror("CLIENT recvfrom ");
      close(sock);  exit(6);
    }
    write(fileno(stdout),buf,n);                        /* show msg to clnt   */
    memset(buf,0,BUFSIZ);                               /* clear the buffer   */
  }
  close(sock);
  exit(0);
}
[/code:1]
The header file is
[code:1]
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#define  PORT   6969
static char     buf[BUFSIZ];  /* Buffer for messages                  */
[/code:1]
回复

使用道具 举报

发表于 2003-5-1 12:10:10 | 显示全部楼层
but for udp, u need check the packet corrupt, lose, and reorder problem. a different story
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-16 01:34 , Processed in 0.046526 second(s), 16 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表