QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1723|回复: 2

Linux下使用原始SOCKET调用(转帖供游戏开发参考)

[复制链接]
发表于 2003-9-16 20:15:43 | 显示全部楼层 |阅读模式
[code:1]
/* Whoisserver.c */

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <pwd.h>

#define BACKLOG                5
#define MAXHOSTNAME        32

main(argc, argv)
int argc;
char *argv[];
{

        int s, t;
        int i;
        struct sockaddr_in sa, isa;
        struct hostent *hp;
        char *myname;
        struct servent *sp;
        char localhost[MAXHOSTNAME + 1];

        myname = argv[0];

        if ((sp = getservbyname("whois", "tcp")) == NULL) {
                fprintf(stderr, "%s: NO whois service on this host\n", myname);
                exit(1);
        }

        gethostname(localhost, MAXHOSTNAME);
        if ((hp = gethostbyname(localhost)) == NULL) {
                fprintf(stderr, "%s: cannot get local host info?\n", myname);
                exit(1);
        }

    sa.sin_port = sp->s_port;
        bcopy((char *)hp->h_addr, (char *)&sa.sin_addr, hp->h_length);
        sa.sin_family = hp->h_addrtype;

        if ((s = socket(hp->h_addrtype, SOCK_STREAM, 0)) < 0) {
                perror("socket");
                exit(1);
        }

        if (bind(s, (struct sockaddr * ) &sa, sizeof(sa)) < 0) {
                perror("bind");
                exit(1);
        }

        listen(s, BACKLOG);

        while(1) {
                i = sizeof(isa);
                if ((t = accept(s, (struct sockaddr *) &isa, &i)) < 0) {
                        perror("accept");
                        exit(1);
                }
               
                whois(t);
                close(t);
        }
}

whois(sock)
int sock;
{
        struct passwd *p;
        char buf[BUFSIZ];
        int i;

        if ((i = read(sock, buf, BUFSIZ)) <= 0) return;
       
        buf[i] = ' ';
       
        if ((p = getpwnam(buf)) == NULL)
                strcpy(buf, "Hi,User not found\n");
        else
                sprintf(buf, "%s: %s\n", p->pw_name, p->pw_gecos);

        write(sock, buf, strlen(buf));
        return;
}

/* End of whoisserver */

/* Whoisclient.c */

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>

main(argc, argv)
int argc;
char *argv[];
{
        int s;
        int len;
        struct sockaddr_in sa;
        struct hostent *hp;
        struct servent *sp;
        char buf[BUFSIZ];
        char *myname;
        char *host;
        char *user;

        myname = argv[0];

        if (argc != 3) {
                fprintf(stderr, "Usage: %s host uname\n", myname);
                exit(1);
        }

        host = argv[1];
        user = argv[2];

        if ((hp = gethostbyname(host)) == NULL) {
                fprintf(stderr, "%s: %s: no such host?", myname, host);
                exit(1);
        }

        bcopy((char *)hp->h_addr, (char *) &sa.sin_addr, hp->h_length);
        sa.sin_family = hp->h_addrtype;


        if ((sp = getservbyname("whois", "tcp")) == NULL) {
                fprintf(stderr, "%s: No whois service on this host\n", myname);
                exit(1);
        }
        sa.sin_port = sp->s_port;

        if ((s = socket(hp->h_addrtype, SOCK_STREAM, 0)) < 0) {
                perror("socket");
                exit(1);
        }

        if (connect(s, (struct sockaddr * ) &sa, sizeof(sa)) < 0) {
                perror("connect");
                exit(1);
        }

        if (write(s, user, strlen(user)) != strlen(user)) {
                fprintf(stderr, "%s: write error\n", myname);
                exit(1);
        }

        while((len = read(s, buf, BUFSIZ)) > 0) write(0, buf, len);

        close(s);
        exit(0);
}
/*end of who is client*/
[/code:1]
发表于 2003-9-19 22:15:37 | 显示全部楼层
呵呵~这个好像不是原始socket啊~原始socket(SOCK_RAW)在网络游戏上应该用不到的~
回复

使用道具 举报

发表于 2003-10-16 10:13:24 | 显示全部楼层
deaboway,应该改成说事写网络游戏用到的几个socket调用~
回复

使用道具 举报

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

本版积分规则

GMT+8, 2024-11-13 04:19 , Processed in 0.039059 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

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