0

これは、クライアントとサーバーの間で SIP (セッション開始プロトコル) を確立したいクライアント サーバー アプリケーションです。

ですから、どうすればこれを行うことができるか教えてください。


サーバー.c:


#include  <stdio.h>
#include  <stdlib.h>
#include  <unistd.h>
#include  <errno.h>
#include  <string.h>
#include  <sys/types.h>
#include  <sys/socket.h>
#include  <netinet/in.h>
#include  <arpa/inet.h>
#include  <sys/wait.h> 
#include  <signal.h>
#include <netinet/tcp.h>

#define MYPORT 3490 // the port users will be connecting to
#define BACKLOG 10    // how many pending connections queue will hold
#define MAXDATASIZE 100

void str_server(int); 

void sigchld_handler(int s)
{
 while(waitpid(-1, NULL, WNOHANG) > 0);
}
int main(void)
{
 int sockfd, numbytes,new_fd, optlen; // listen on sock_fd, new connection on new_fd
 struct sockaddr_in my_addr; // my address information
 struct sockaddr_in their_addr; // connector's address information
 struct tcp_info info;
 socklen_t sin_size;
 struct sigaction sa;
 char buf[MAXDATASIZE];
 int yes=1;
 if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
     perror("socket");
     exit(1);
 }
 if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)) == -1) {
     perror("setsockopt");
     exit(1);
 }
 my_addr.sin_family = AF_INET;         // host byte order
 my_addr.sin_port = htons(MYPORT);     // short, network byte order
 my_addr.sin_addr.s_addr = INADDR_ANY; // automatically fill with my IP
 memset(my_addr.sin_zero, '\0', sizeof my_addr.sin_zero);
 if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof my_addr) == -1) {
     perror("bind");
     exit(1);
 }
 if (listen(sockfd, BACKLOG) == -1) {
     perror("listen");
     exit(1);
 }
 sa.sa_handler = sigchld_handler; // reap all dead processes
 sigemptyset(&sa.sa_mask);
 sa.sa_flags = SA_RESTART;
 if (sigaction(SIGCHLD, &sa, NULL) == -1) {
     perror("sigaction");
     exit(1);
 }
 while(1) { // main accept() loop
     sin_size = sizeof their_addr;
     getchar();
     if ((new_fd = accept(sockfd, (struct sockaddr *)&their_addr, \
             &sin_size)) == -1) {
         perror("accept");
         continue;
     }
     printf("server: got connection from %s\n", \
         inet_ntoa(their_addr.sin_addr));

     if (!fork()) { // this is the child process
         close(sockfd); // child doesn't need the listener
         if ((numbytes=recv(new_fd, buf, MAXDATASIZE-1, 0)) == -1) {
            perror("recv");
            exit(1);
        }
        buf[numbytes] = '\0';
        printf("Received From Client: %s\n",buf);

 str_server(sockfd);
 FILE *fp = fopen( "adventure.mpg", "rb" );
 //if(!fork())
 // execlp("gedit", "gedit", "SIPFILE.txt", NULL);
            //system("popen /home/umair/Documents/CurrentData/SIPFILE.txt");
     //ShellExecute(GetDesktopWindow(), "open","ls /home/umair/Documents 

            /CurrentData/SIPFILE.txt",NULL, NULL, SW_SHOW);
         if (send(new_fd, "Hello, world!\n", 14, 0) == -1)
             perror("send");
         close(new_fd);
         exit(0);
     }
     close(new_fd); // parent doesn't need this

 }
 return 0;
 }

void str_server(int sock) 
{ 
 char buf[1025]; 
 const char* filename = "test.text"; 
 FILE *file = fopen(filename, "rb"); 
 if (!file)
{
    printf("Can't open file for reading"); 
    return;
}
while (!feof(file)) 
{ 
    int rval = fread(buf, 1, sizeof(buf), file); 
    if (rval < 1)
    {
        printf("Can't read from file");
        fclose(file);
        return;
    }

    int off = 0;
    do
    {
        int sent = send(sock, &buf[off], rval - off, 0);
        if (sent < 1)
        {
            // if the socket is non-blocking, then check
            // the socket error for WSAEWOULDBLOCK/EAGAIN
            // (depending on platform) and if true then
            // use select() to wait for a small period of
            // time to see if the socket becomes writable
            // again before failing the transfer...

            printf("Can't write to socket");
            fclose(file);
            return;
        }

        off += sent;
    }
    while (off < rval);
} 

fclose(file);
}

//client.c:


#include  <stdio.h>
#include  <stdlib.h>
#include  <unistd.h>
#include  <errno.h>
#include  <string.h>
#include  <netdb.h>
#include  <sys/types.h>
#include  <netinet/in.h>
#include  <sys/socket.h>
#include <netinet/tcp.h>
#define PORT 3490 // the port client will be connecting to
#define MAXDATASIZE 100 // max number of bytes we can get at once

void RecvFile(int , const char* );
FILE *filename;

int main(int argc, char *argv[])
{
 int sockfd, numbytes, optlen;
 char buf[MAXDATASIZE];
 char *message;
 struct hostent *he;
 struct tcp_info info;
 struct sockaddr_in their_addr; // connector's address information
 if (argc != 2) {
     fprintf(stderr,"usage: client hostname\n");
     exit(1);
 }
if ((he=gethostbyname(argv[1])) == NULL) {   // get the host info
     herror("gethostbyname");

     exit(1);
 }
 if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
     perror("socket");
     exit(1);
 }
 their_addr.sin_family = AF_INET;    // host byte order
 their_addr.sin_port = htons(PORT); // short, network byte order
 their_addr.sin_addr = *((struct in_addr *)he->h_addr);
 memset(their_addr.sin_zero, '\0', sizeof their_addr.sin_zero);
 if (connect(sockfd, (struct sockaddr *)&their_addr,
                                       sizeof their_addr) == -1) {
     perror("connect");
     exit(1);
 }
 printf("connect successfull\n");
/* if (send(sockfd, "Hello, world!\n", 14, 0) == -1)
     perror("send");
 printf("send successfull\n");
*/    
 message = "GET /?st=1 HTTP/1.1\r\nHost: www.msn.com\r\n\r\n";
if( send(sockfd , message , strlen(message) , 0) < 0)
{
    puts("Send failed");
    return 1;
}
puts("Data Send\n");
  RecvFile(sockfd , message);

 optlen = sizeof(info);
 if ((numbytes=recv(sockfd, buf, MAXDATASIZE-1, 0)) == -1) {
     perror("recv");
     exit(1);
 }
 buf[numbytes] = '\0';
 printf("Received: %s\n",buf);
 close(sockfd);

 return 0;
 }


void RecvFile(int sock, const char* filename) 
{ 
int rval; 
char buf[0x1000]; 
FILE *file = fopen(filename, "wb"); 
if (!file)
{
    printf("Can't open file for writing");
    return;
}

do
{
    rval = recv(sock, buf, sizeof(buf), 0);
    if (rval < 0)
    {
        // if the socket is non-blocking, then check
        // the socket error for WSAEWOULDBLOCK/EAGAIN
        // (depending on platform) and if true then
        // use select() to wait for a small period of
        // time to see if the socket becomes readable
        // again before failing the transfer...

        printf("Can't read from socket");
        fclose(file);
        return;
    }

    if (rval == 0)
        break;

    int off = 0;
    do
    {
        int written = fwrite(&buf[off], 1, rval - off, file);
        if (written < 1)
        {
            printf("Can't write to file");
            fclose(file);
            return;
        }

        off += written;
    }   
    while (off < rval);
} 
while (!feof(file)); 
fclose(file); 
}

Any Suggestion?
4

2 に答える 2

0

SIP で何をしようとしているのかわかりませんが、提供されたコード スニペットは TCP/IP 接続の確立のみを示しています。SIP サーバー/クライアント アプリケーションを作成する場合は、その過程で役立つライブラリを探すことをお勧めします。

私が知っている非常に完全なものは、Sofia SIP と呼ばれるものです。

http://sofia-sip.sourceforge.net/

これは、Nokia が Linux 用に C 言語で作成したものです。

ソースコードはこちらから入手できます: http://gitorious.org/sofia-sip/sofia-sip/trees/master

(古いhttp://sourceforge.net/p/sofia-sip/git/ci/master/tree/ )

于 2013-07-24T11:49:58.390 に答える
0

このユーティリティとそのドキュメントsippを通じて、シナリオとメッセージの受け渡しについて学ぶことができます。

于 2013-07-24T12:12:15.723 に答える