wgetのようなダウンロードプログラムを作ろう の続きです

ラズベリーパイを持っているなら、ネットワークプログラミングをしてみましょう。
echoサーバーとはネットワークにつながっているか確認するプログラムです。

TCP/IPネットワークプログラミング ここを改造しました。

変更点は何度も接続できるようにしたのと、クライエントからquit文字列を送ると切断できるようにしました。


echoserver.c 
ラズベリーパイで実行します。

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

#define PORT 9876

int main(){
    int i;
    int srcSocket;
    int dstSocket;
  
    struct sockaddr_in srcAddr;
    struct sockaddr_in dstAddr;
    int dstAddrSize = sizeof(dstAddr);
    // 各種パラメータ
    int status;
    int numrcv;
    char buf[1024];

  //sockaddr_in 構造体のセット
    bzero((char *)&srcAddr, sizeof(srcAddr));
    srcAddr.sin_port = htons(PORT);
    srcAddr.sin_family = AF_INET;
    srcAddr.sin_addr.s_addr = INADDR_ANY;
    
    srcSocket = socket(AF_INET, SOCK_STREAM, 0);
    bind(srcSocket, (struct sockaddr *)&srcAddr, sizeof(srcAddr));
    listen(srcSocket, 1);


while(1){
// 接続の受付け
    printf("接続を待っています\nクライアントプログラムを動かして下さい\n");
    dstSocket = accept(srcSocket, (struct sockaddr *)&dstAddr, &dstAddrSize);
    printf("%s から接続を受けました\n",inet_ntoa(dstAddr.sin_addr));
    
        
    while(1){
//パケットの受信
      numrcv = read(dstSocket, buf, 1024);
if(numrcv ==0 || numrcv ==-1 ){
close(dstSocket);
break;
}
if(!strcmp(buf, "quit")) {
write(dstSocket, "bye\n", 1024);
close(dstSocket);
break;
}
     
printf("変換前 %s", buf);
for (i = 0; i < numrcv; i++) {
if(isalpha(buf[i])) {
buf[i] = toupper(buf[i]);
}
}
      
// パケットの送信
    write(dstSocket, buf, 1024);
      fprintf(stdout,"> %s\n\n",buf);
}
}
close(srcSocket);
return(0);



echoclient.c 
PC側で実行します。

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

#define PORT 9876 //サーバープログラムとポート番号を合わせてください

int main(){
char destination[32] = "192.168.0.10";//サーバーマシンのIPアドレスを入れます。

//ソケット,sockaddr_in 構造体
int dstSocket;
struct sockaddr_in dstAddr;

//struct sockaddr_in addr;
  struct hostent *hp;
  char   buf[1024];
int    numrcv;

// 相手先アドレスの入力と送る文字の入力
  //printf("サーバーマシンのIPは?:");
//scanf("%s", destination);
  
  //sockaddr_in 構造体のセット
bzero((char *)&dstAddr, sizeof(dstAddr));
dstAddr.sin_family = AF_INET;
dstAddr.sin_port = htons(PORT);
  
  hp = gethostbyname(destination);
bcopy(hp->h_addr, &dstAddr.sin_addr, hp->h_length);

//ソケットの生成
dstSocket = socket(AF_INET, SOCK_STREAM, 0);
  
  //接続
  if (connect(dstSocket, (struct sockaddr *)&dstAddr, sizeof(dstAddr)) < 0){
  printf("%s に接続できませんでした\n",destination);
    return(-1);
}
printf("%s に接続しました\n",destination);
printf("適当なアルファベットを入力してください\n");
  
while (1){
    scanf("%s",buf);
    //パケットの送信
    write(dstSocket, buf, 1024);
    //パケットの受信
    numrcv = read(dstSocket, buf, 1024);
if (!strcmp(buf, "bye\n")) {
printf("bye\n");
break;
}
    printf("→ %s\n\n",buf);
}
close(dstSocket);
return(0);
}