#include < sys/types.h > #include < sys/socket.h > #include < netinet/in.h > #include#include int main() { int sock_fd; struct sockaddr_in sv_addr; ssize_t n; if ((sock_fd = socket(PF_INET, SOCK_DGRAM, 0)) < 0){ perror("socket"); return 1; } memset(&sv_addr, 0, sizeof sv_addr); sv_addr.sin_family = AF_INET; sv_addr.sin_addr.s_addr =htonl(INADDR_LOOPBACK); sv_addr.sin_port = htons(12345); if ((n = sendto(sock_fd, "Hello\n", 6, 0, (struct sockaddr *)&sv_addr, sizeof sv_addr)) < 0){ perror("sendto"); return 1; } return 0; }
Category: C++
recvfrom
#include < sys/types.h >
#include < sys/socket.h >
#include < netinet/in.h >
#include < unistd.h >
#include < stdio.h >
#include < string.h >
#include < arpa/inet.h >
int main()
{
int sock_fd;
struct sockaddr_in sv_addr, cl_addr;
socklen_t cl_len;
ssize_t n;
char buf[4096];
if((sock_fd = socket(PF_INET, SOCK_DGRAM, 0)) < 0){
perror("socket");
return 1;
}
memset(&sv_addr, 0, sizeof sv_addr);
sv_addr.sin_family = AF_INET;
sv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
sv_addr.sin_port = htons(12345);
if (bind(sock_fd, (struct sockaddr *)&sv_addr, sizeof sv_addr)<0){
perror("bind");
return 1;
}
cl_len = sizeof cl_addr;
if ((n = recvfrom(sock_fd, buf, sizeof buf, 0,
(struct sockaddr *)&cl_addr, &cl_len)) < 0){
perror("recvfrom");
return 1;
}
fprintf(stderr, "UDP from addr = %s, port = %d\n",
inet_ntoa(cl_addr.sin_addr),
ntohs(cl_addr.sin_port));
write(1, buf, n);
return 0;
}
ホスト名を取得
#include#include int main(){ char name[256]; if(gethostname(name, sizeof name)<0){ perror("gethostname"); return 1; } printf("%s\n", name); return 0; }
システム情報を取得
OSなどのシステム情報を取得するにはunameを使います。
#include < sys/utsname.h >
#include < stdio.h >
int main()
{
struct utsname buf;
if (uname(&buf) < 0){
perror("uname");
return 1;
}
printf("%s %s %s %s %s\n",
buf.sysname,
buf.nodename,
buf.release,
buf.version,
buf.machine);
return 0;
}
settimeofday
#include < sys/time.h >
#include < time.h >
#include < stdio.h >
int main(){
struct timeval tv;
struct tm tm;
tm.tm_sec = 0;
tm.tm_min = 0;
tm.tm_hour = 0;
tm.tm_mday = 1;
tm.tm_mon = 0;
tm.tm_year = 138;
tm.tm_isdst = 0;
tv.tv_sec = mktime(&tm);
tv.tv_usec = 0;
if (settimeofday(&tv, NULL) < 0){
perror("settimeofday");
return 1;
}
return 0;
}
現在時刻を取得
#include < sys/time.h >
#include < time.h >
#include < stdio.h >
int main()
{
struct timeval tv;
if (gettimeofday(&tv, NULL) < 0){
perror("gettimeofday");
return 1;
}
printf("%s", ctime(&tv.tv_sec));
return 0;
}
signal
#include < signal.h >
#include < unistd.h >
#include < stdio.h >
static void
func_int()
{
write(2, "SIGINT\n", 7);
}
int main()
{
if (signal(SIGINT, func_int) == SIG_ERR){
perror("signal");
return 1;
}
sleep(60);
return 0;
}
getitimer
インターバルタイマーを使って一定時間間隔でシグナルを発生。
#include < sys/time.h >
#include < signal.h >
#include < unistd.h >
#include < stdio.h >
#include < string.h >
static void
interval()
{
write(2, ".", 1);
}
int main()
{
struct itimerval val;
struct sigaction act;
sigset_t set;
memset(&act, 0, sizeof act);
act.sa_handler = interval;
if (sigaction(SIGALRM, &act, NULL)< 0){
perror("sigaction");
return 1;
}
val.it_interval.tv_sec = 1;
val.it_interval.tv_usec = 0;
val.it_value = val.it_interval;
if (setitimer(ITIMER_REAL, & val, NULL) < 0){
perror("setitimer");
return 1;
}
if (getitimer(ITIMER_REAL, &val) < 0){
perror("getitimer");
return 1;
}
printf(
"it_interval = %ld.%ld\n"
"it_value = %ld.%ld\n",
val.it_interval.tv_sec, val.it_interval.tv_usec,
val.it_value.tv_sec, val.it_value.tv_usec);
sigemptyset(&set);
for(;;){
sigsuspend(&set);
}
return 0;
}
sigsuspend
シグナルの到着を待つシステムコールです。シグナルを受信するまでプロセスは停止します。
#include < signal.h >
#include < unistd.h >
#include < stdio.h >
#include < string.h >
static void func_int() {}
int main()
{
struct sigaction act;
sigset_t set;
memset(&act, 0, sizeof act);
act.sa_handler = func_int;
if (sigaction(SIGINT, &act, NULL) < 0){
perror("sigaction");
return 1;
}
sigemptyset(&set);
sigsuspend(&set);
write(2, "SIGINT\n", 7);
return 0;
}
sigaction
sigaction構造体をあらかじめmemset()で0クリアしてから、sa_handlerにシグナルハンドラの関数名を代入します。
#include#include #include #include static void func_int() { write(2, "SIGINT\n", 7); } int main() { struct sigaction act; memset(&act, 0, sizeof act); act.sa_handler = func_int; if (sigaction(SIGINT,&act, NULL) < 0){ perror("sigaction"); return 1; } sleep(60); return 0; }